bean作用域、注解自动装配

Bean的作用范围

singleton	(默认)将每个 Spring IoC 容器的单个 bean 定义范围限定为单个对象实例。
prototype	将单个 bean 定义的作用域限定为任意数量的对象实例。
request	将单个 bean 定义的范围限定为单个 HTTP 请求的生命周期。也就是说,每个 HTTP 请求都有一个在单个 bean 定义后面创建的 bean 实例。仅在可感知网络的 Spring ApplicationContext中有效。
session	将单个 bean 定义的范围限定为 HTTP Session的生命周期。仅在可感知网络的 Spring ApplicationContext上下文中有效。
application	将单个 bean 定义的范围限定为ServletContext的生命周期。仅在可感知网络的 Spring ApplicationContext上下文中有效。
websocket	将单个 bean 定义的范围限定为WebSocket的生命周期。仅在可感知网络的 Spring ApplicationContext上下文中有效。

当我们是使用单例模式,在多线程下经常使用

 <bean id="user" class="aw.dao.User" c:args="阿牛" p:name="阿威" p:age="20" p:sex="男" scope="singleton"/>
 public void test3(){
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext5.xml");
        User user = (User) context.getBean("user");
        User user2 = (User) context.getBean("user");
		//true
        System.out.println(user==user2);

    }

使用原型模式

    <bean id="user" class="aw.dao.User" c:args="阿牛" p:name="阿威" p:age="20" p:sex="男" scope="prototype"/>

每次调用bean方法他都会创建一个对象。

 public void test3(){
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext5.xml");
        User user = (User) context.getBean("user");
        User user2 = (User) context.getBean("user");
//false
        System.out.println(user==user2);

    }

其他几种模式实在web端下使用。

Bean的自动装配

1.使用xml进行(已经了解)
2.使用原生java显示配置
3.隐士的自动装配
隐士装配
我们可以在bean中添加autowire属性,这是自动装饰的意思。
byName值:需要保证在当前xml文件中bean的id唯一,并且这个bean需要和注入对象中属性的set方法名一致

  <bean id="cat" class="aw.dao.Cat"/>
    <bean id="dog" class="aw.dao.Dog"/>


    <bean id="people" class="aw.dao.People" autowire="byName">
        <property name="name" value="阿威"/>
    </bean>

byType值:需要保证在当前xml文件中bean的class唯一,并且这个bean需要和注入对象中属性的类型一致

<bean id="cat" class="aw.dao.Cat"/>
    <bean id="dog" class="aw.dao.Dog"/>


    <bean id="people" class="aw.dao.People" autowire="byType">
        <property name="name" value="阿威"/>
    </bean>

注解配置容器

添加不同的头文件。

<?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">

开启注解、context:annotation-config/仅在定义它的相同应用程序上下文中查找 bean 上的 注解。

<context:annotation-config/>

@Autowired注解

<?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">

    <context:annotation-config/>

    <bean id="cat" class="aw.dao.Cat"/>
    <bean id="dog" class="aw.dao.Dog"/>


    <bean id="people" class="aw.dao.People">
        <property name="name" value="阿威"/>
    </bean>

</beans>

我们需要在实体类中相应的属性上面添加上@Autowired注解,这样我们就不用再去写他的set方法了。

package aw.dao;

import org.springframework.beans.factory.annotation.Autowired;

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

    public Cat getCat() {
        return cat;
    }
    

    public Dog getDog() {
        return dog;
    }

   
    public String getName() {
        return name;
    }

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

我们还可以直接在set方法上面添加@Autowired

package aw.dao;

import org.springframework.beans.factory.annotation.Autowired;

public class People {

    private Cat cat;
    public Dog dog;
    public String name;

    public Cat getCat() {
        return cat;
    }
    @Autowired
    public void setCat(Cat cat) {
        this.cat = cat;
    }

    public Dog getDog() {
        return dog;
    }
    @Autowired
    public void setDog(Dog dog) {
        this.dog = dog;
    }

    public String getName() {
        return name;
    }

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

我们进到这个注解的内部可以看到有一个required默认值为true。

public @interface Autowired {
    boolean required() default true;
}

当我们在中的添加required=false 。意思是这个对象可以为空,我们不写set方法也可以使用。

package aw.dao;

import org.springframework.beans.factory.annotation.Autowired;

public class People {
    @Autowired(required = false)
    private Cat cat;
    @Autowired
    public Dog dog;
    public 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;
    }
}

@Qualifier(value=“xx”)次注解是配合@Autowired使用的,当我们有多个bean执行的类型一样但是名字不一样,我们可以使用@Qualifier使用来确定他的唯一值。

 @Autowired
    @Qualifier(value="cat123")
    private Cat cat;
<bean id="cat1" class="aw.dao.Cat"/>
    <bean id="cat123" class="aw.dao.Cat"/>

@Nullable 这个注解的意思是可以让这个字段为空。

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

@Resource这个注解相对来说比较强大,他会先通过名来进行查找,然后在通过类型查找。这里的类型必须全局唯一的,不然会报错。

    @Resource
    public Dog dog;
 <bean id="dog1" class="aw.dao.Dog"/>

现在类型不是唯一的,我们就需要给他添加名字。

 @Resource(name = "dog2")
    public Dog dog;
 <bean id="dog1" class="aw.dao.Dog"/>
    <bean id="dog2" class="aw.dao.Dog"/>

@Autowired是通过类型来查找的,对象不能为空。
@Resource是通过默认的名字来找的,找不到他就会通过类型来查找。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值