Spring管理Bean(XML与注解方式)

Posted 流楚丶格念

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring管理Bean(XML与注解方式)相关的知识,希望对你有一定的参考价值。

文章目录

什么是Bean管理?

bean管理其实指的是这两个操作:

  1. 创建对象
  2. 注入属性

Spring是如何管理Bean的?

Spring通过IoC容器来管理Bean,我们可以通过XML配置或者注解配置,来指导IoC容器对Bean的管理。因为注解配置比XML配置方便很多,所以现在大多时候会使用注解配置的方式。

下面分别来看一下:

环境准备

新建maven项目,引入依赖

<!--  引入依赖  -->
<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.0.2.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
        <version>1.2</version>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.12</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
</dependencies>

基于xml方式注入属性

第一种注入方式:使用set方式进行注入。

实现步骤如下所示:

创建类,定义属性和对应的set方法;

public class Book 
    //创建属性
    private String bname;
    private String bauthor;

    //创建属性对应的set方法
    public void setBname(String bname)
        this.bname = bname;
    
    public void setBauthor(String bauthor) 
        this.bauthor = bauthor;
    

在spring配置文件配置对象创建(<bean>标签),配置属性注入(<bean>标签内部的<property>标签)。注入属性在创建对象的基础之上完成,先创建对象,在注入属性。

<!-- set方法注入属性-->
<bean id = "book" class="com.yyl.entity.Book">
    <!-- 使用property完成属性注入
            name: 类里面属性名称
            value:向属性注入的值
        -->
    <property name="bname" value="从你的全世界路过"></property>
    <property name="bauthor" value="张嘉佳"></property>
</bean>

对xml方式使用set进行注入的测试:

@Test
public void SetterBean() 
    // 1. 加载spring 配置文件
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    // 2. 获取配置创建的对象
    Book book = context.getBean("book", Book.class);
    System.out.println(book.hashCode());
    System.out.println(book.toString());

测试结果:

第二种注入方式:使用有参数的构造函数进行注入

实现步骤如下所示:

创建类,定义属性,创建属性对应的有参数构造方法

public class Orders 
    //属性
    private String name;
    private String address;
    //多参数构造函数
    public Orders(String name, String address) 
        this.name = name;
        this.address = address;
    

在spring配置文件中进行配置:

<!-- 使用有参构造函数注入属性-->
<bean id="orders" class="com.yyl.entity.Orders">
    <constructor-arg name="name" value="衣架"></constructor-arg>
    <constructor-arg name ="address" value="china"></constructor-arg>
</bean>

对xml方式使用有参构造注入的测试:

@Test
public void ConstructorBean() 
    // 1. 加载spring 配置文件
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    // 2. 获取配置创建的对象
    Orders orders = context.getBean("orders", Orders.class);
    System.out.println(orders.hashCode());
    System.out.println(orders.toString());

测试结果:

注解配置

以下是管理Bean时常用的一些注解:

  1. @ComponentScan用于声明扫描策略,通过它的声明,容器就知道要扫描哪些包下带有声明的类,也可以知道哪些特定的类是被排除在外的。

  2. @Component、@Repository、@Service、@Controller用于声明Bean,它们的作用一样,但是语义不同。@Component用于声明通用的Bean,@Repository用于声明DAO层的Bean,@Service用于声明业务层的Bean,@Controller用于声明视图层的控制器Bean,被这些注解声明的类就可以被容器扫描并创建。

  3. @Autowired、@Qualifier用于注入Bean,即告诉容器应该为当前属性注入哪个Bean。其中,@Autowired是按照Bean的类型进行匹配的,如果这个属性的类型具有多个Bean,就可以通过@Qualifier指定Bean的名称,以消除歧义。

  4. @Scope用于声明Bean的作用域,默认情况下Bean是单例的,即在整个容器中这个类型只有一个实例。可以通过@Scope注解指定prototype值将其声明为多例的,也可以将Bean声明为session级作用域、request级作用域等等,但最常用的还是默认的单例模式。

  5. @PostConstruct、@PreDestroy用于声明Bean的生命周期。其中,被@PostConstruct修饰的方法将在Bean实例化后被调用,@PreDestroy修饰的方法将在容器销毁前被调用。

半注解式代码

配置文件中 配置的扫描不再用<bean>标签,而是扫描包下注解:

<!--    扫描注入-->
<context:component-scan base-package=""></context:component-scan>

下面我们进行测试:
修改xml文件:

<!--配置扫面-->
<!--配置扫描带有四大注解类:@Controller、@Service、@Repository、@Component,交给spring统一管理-->
<context:component-scan base-package="com.yyl"></context:component-scan>

编写User类

package com.yyl.entity;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component(value = "user")
public class User 

    @Value("18")
    private int age;

    @Value("玉如梦")
    private String name;

    @Override
    public String toString() 
        return "User" +
                "age=" + age +
                ", name='" + name + '\\'' +
                '';
    

编写测试代码:

@Test
public void AnnotationBean()
    // 1. 加载spring 配置文件
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    // 2. 获取配置创建的对象
    User user = context.getBean("user", User.class);
    System.out.println(user);

运行结果:

纯注解代码

编写配置类:

package com.yyl.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration//声明配置类
@ComponentScan(value = "com.yyl")  //扫描具体的包
public class SpringConfig 


编写测试代码:

@Test
public void AnnotationBean2()
    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
    User user = context.getBean("user",User.class);
    System.out.println(user);

运行结果:

以上是关于Spring管理Bean(XML与注解方式)的主要内容,如果未能解决你的问题,请参考以下文章

spring5:IOC 操作 Bean 管理(基于注解方式)

Bean管理(注解)和AOP

spring之@Primary与@Qualifier注解

14. spring的bean配置的几种方式

spring-bean(注解方式-管理及依赖注入)

Spring Bean管理(注解的方式)