Spring中Bean的作用域&XML的自动装配(注解)


1、bean的作用域

​ 在XML文件中,bean对象后面加一个scope便可以知道这个bean的作用域,但是在Spring中默认为单例

1.1、当scope=singleton时为单例

<bean id="myBean" class="com.wang.pojo.MyBean" scope="singleton"></bean>

1.2、当scope=prototype时为多例

<bean id="myBean" class="com.wang.pojo.MyBean" scope="prototype"></bean>

除此之外还有,requestsession作用域。(^▽^)(还没学)

1.3、bean的一个周期:

底层的bean是如何执行?

  • 执行无参数的构造
  • 执行set方法设置属性值
  • 在初始化方法前添加前置处理器
  • 执行初始化方法
  • 在初始化方法后添加后置处理器
  • 获取创建Bean的实例对象
  • 执行销毁方法(context.close执行即完成销毁)

注:这也是为什么要写set和get方法

O(∩_∩)O哈哈~不过IDEA快捷键(alt+insert一键生成set和get方法,我一次都没自己手写过)

2、xml自动装配

写一个测试的person类:

public class Person {
    private   Cat cat;
    private   Dog dog;
    private String name;
    public Cat getCat() {
        return cat;
    }
    public void setCat(Cat cat) {
        this.cat = cat;
    }
    public Dog getDog() {
        return dog;
    }
    public void setDog(Dog dog) {
        this.dog = dog;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public String toString() {
        return "Person{" +
                "cat=" + cat +
                ", dog=" + dog +
                ", name='" + name + '\'' +
                '}';
    }
}

2.1、byName装配

Bean的id值必须与类中变量名一致

<bean id="cat" class="Cat"/>
<bean id="dog" class="Dog"/>
自动装配
<bean id="person" class="Person" autowire="byName">
    <property name="name" value="kimihua"/>
</bean>

就是在bean中加一个autowire

2.2、byType装配

注:不能有相同类型的Bean

<bean id="person" class="Person" autowire="byType">
    <property name="name" value="kimihua"/>
</bean>

2.3、利用注解自动装配

前提:在spring4之后,想要使用注解形式,必须得要引入aop的包,而且在配置文件当中,还得要引入一个context约束。

完整配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
</beans>

好了,可以开始注解操作了||ヽ( ̄▽ ̄)ノミ|Ю(事真多)

首先在xml文件中打开注解支持,如下:

<context:component-scan base-package="org.example"/>

这个意思就是:扫描该目录下的所有包,这样加了注解之后就可以被发现。

完整的xml的文件呢:

<context:component-scan base-package="org.example"/>
<bean id="cat" class="com.demo.pro.Cat"/>
<bean id="dog" class="com.demo.pro.Dog"/>
<bean id="person" class="com.demo.pro.Person"/>

然后在测试person类中加上@Autowired

public class Person {
    @Autowired
    private   Cat cat;
    @Autowired
    private   Dog dog;
    private String name;

    public Cat getCat() {
        return cat;
    }

//    public void setCat(Cat cat) {
//        this.cat = cat;
//    }

    public Dog getDog() {
        return dog;
    }

//    public void setDog(Dog dog) {
//        this.dog = dog;
//    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Person{" +
                "cat=" + cat +
                ", dog=" + dog +
                ", name='" + name + '\'' +
                '}';
    }
}

小贴士:

利用注解的方式写,可以不用set方法。

^_(^▽^)好像挺方便的!!!

2.4、其他注解

2.4.1、@Qualifier

按名称自动装配(byName){不能单独使用,需跟@Autowired()搭配使用}

@Autowired()匹配多个类型的值时可使用@Qualifier()取出其中一个

@Autowired
@Qualifier(value = "str")
private String str;

2.4.2、@Resource

实现方式:先进行byName查找 失败;再进行byType查找

public class User {
    //如果允许对象为null,设置required = false,默认为true
    @Resource(name = "cat2")
    private Cat cat;
    @Resource
    private Dog dog;
    private String name;
}

文章作者: fatzard
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 fatzard !
评论
  目录
本站总访问量