Spring自动装配【Bean的作用域、@Autowried、@Resource】

简介: Spring自动装配【Bean的作用域、@Autowried、@Resource】

Bean 作用域

1、singleton(单例模式)

默认就是单例模式,不需要单独设置。

    <bean id="user" class="com.study.pojo.User" p:name="燕双鹰" p:age="25" scope="prototype"/>
ApplicationContext context = new ClassPathXmlApplicationContext("userbeans.xml");
Person person = context.getBean("person", Person.class);
Person person1 = context.getBean("person", Person.class);
System.out.println(person==person1);    //true

2、prototype

    <bean id="user" class="com.study.pojo.User" p:name="燕双鹰" p:age="25" scope="singleton"/>

每次从容器中 get ,都会产生一个新对象!

ApplicationContext context = new ClassPathXmlApplicationContext("userbeans.xml");
Person person = context.getBean("person", Person.class);
Person person1 = context.getBean("person", Person.class);
System.out.println(person==person1);    //false

3、其它

request、session、application 这些只在 web 开发中使用到!

Bean 的自动装配

  • 自动装配是Spring满足Bean依赖的一种方式!
  • Spring会在上下文中自动寻找,并自动给Bean装配属性!

1、测试

编写三个类Cat、Dog、People。

public class Dog {
    public void shout(){
        System.out.println("woof~");
    }
}
public class Cat {
    public void shout(){
        System.out.println("miu~");
    }
}
public class People {
    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 "People{" +
                "cat=" + cat +
                ", dog=" + dog +
                ", name='" + name + '\'' +
                '}';
    }
}

在Spring的beans.xml中注册,这也是我们普通的装配方式。

    <bean id="cat" class="com.study.autowried.Cat"/>
    <bean id="dog" class="com.study.autowried.Dog"/>
    <bean id="people" class="com.study.autowried.People" autowire="byName">
        <property name="dog" ref="dog"/>
        <property name="cat" ref="cat"/>
        <property name="name" value="李元芳"/>
    </bean>

byName 自动装配

byName需要bean标签的id属性和set方法对应!setDog方法必须对应 bean标签属性id为 "dog"。

    <bean id="cat" class="com.study.autowried.Cat"/>
    <bean id="dog" class="com.study.autowried.Dog"/>
    <!--
    byName:会自动在容器上下文自动查找和自己对象set方法对应的beanid
    -->
    <bean id="people" class="com.study.autowried.People" autowire="byName">
        <property name="name" value="李元芳"/>
    </bean>

byType 自动装配

byType不需要设置bean标签的id属性,因为它是根据bean的类去查找的,所以必须保证所以bean标签的 class 属性唯一。

    <bean class="com.study.autowried.Cat"/>
    <bean class="com.study.autowried.Dog"/>
    <!--
    byType:会自动在容器上下文自动查找和自己对象类型相同的bean
    -->
    <bean id="people" class="com.study.autowried.People" autowire="byName">
        <property name="name" value="李元芳"/>
    </bean>

使用注解实现自动装配@Autowired

使用注解需要在Spring的beans.xml中

  • 导入约束:  xmlns:context="http://www.springframework.org/schema/context"
  • 配置注解的支持:<context:annotation-config/>
<?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/>
</beans>

      默认情况下,@Autowired注解是通过byType方式实现自动装配的,如果希望通过byName方式进行自动装配,可以在@Autowired注解上结合@Qualifier注解使用。

测试

<?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"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:c="http://www.springframework.org/schema/c"
       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="com.study.autowried.Cat"/>
    <bean id="dog" class="com.study.autowried.Dog"/>
    <bean id="people" class="com.study.autowried.People"/>
</beans>

使用Autowried注解我们可以不用编写Set方法。

import org.springframework.beans.factory.annotation.Autowired;
public class People {
    //直接加载属性上即可实现自动装配
    @Autowired
    private Cat cat;
    @Autowired
    private Dog dog;
    private String name;
    public Cat getCat() {
        return cat;
    }
    public Dog getDog() {
        return dog;
    }
    public String getName() {
        return name;
    }
    @Override
    public String toString() {
        return "People{" +
                "cat=" + cat +
                ", dog=" + dog +
                ", name='" + name + '\'' +
                '}';
    }
}

其它

@Autowried的required属性

如果Autowried的属性required的值为false,则这个对象可以为null,否则不可以为空(默认为true,不可为空)。

public class People {
    @Autowired(required = false)
    private Cat cat;
    @Autowired
    private Dog dog;
    private String name;
}

@Qualifier

如果@Autowried自动装配的环境比较复杂,我们可以使用@Qualifier(value="beanid")来指定唯一的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"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:c="http://www.springframework.org/schema/c"
       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="com.study.autowried.Cat"/>
    <bean id="cat1" class="com.study.autowried.Cat"/>
    <bean id="dog" class="com.study.autowried.Dog"/>
    <bean id="dog1" class="com.study.autowried.Dog"/>
    <bean id="people" class="com.study.autowried.People"/>
</beans>

多个Dog对象和Cat对象,我们需要通过@Qualifier 指定具体的bean的id。

public class People {
    @Autowired
    @Qualifier(value = "cat1")
    private Cat cat;
    @Autowired
    @Qualifier(value = "dog1")
    private Dog dog;
    private String name;
}

@Resource

上面的都是spring中的注解,而这个@Resource是我们java原生的注解,它同样可以实现自动装配。它会先通过byName的方式通过set方法查找对应beanid的bean;如果找不到,就会通过byType的方式通过class找唯一类型的bean;如果我们有多个相同类型的bean,我们可以通过@Resource(name="")的形式来指定对应的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"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:c="http://www.springframework.org/schema/c"
       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="com.study.autowried.Cat"/>
    <bean id="cat1" class="com.study.autowried.Cat"/>
    <bean id="dog" class="com.study.autowried.Dog"/>
    <bean id="dog1" class="com.study.autowried.Dog"/>
    <bean id="people" class="com.study.autowried.People"/>
</beans>
public class People {
    @Resource
    private Cat cat;    //匹配到bean id=cat的bean对象
    @Resource(name="dog1")
    private Dog dog;    //匹配到bean id=dog1的bean对象
    private String name;
}

小结

@Resource和@Autowried的区别:

  • @Autowried 默认通过 byType实现,如果有多个bean可以搭配Qualifier(value="beanid")来实现。
  • @Resource 默认通过 byName实现,如果找不到,会使用 byType实现,同样可以通过@Resource(name="beanid")来匹配指定id的bean。
相关文章
|
11天前
|
XML Java 测试技术
Spring IOC—基于注解配置和管理Bean 万字详解(通俗易懂)
Spring 第三节 IOC——基于注解配置和管理Bean 万字详解!
87 26
|
2月前
|
XML 安全 Java
|
2月前
|
存储 Java Spring
【Spring】获取Bean对象需要哪些注解
@Conntroller,@Service,@Repository,@Component,@Configuration,关于Bean对象的五个常用注解
|
2月前
|
存储 Java 应用服务中间件
【Spring】IoC和DI,控制反转,Bean对象的获取方式
IoC,DI,控制反转容器,Bean的基本常识,类注解@Controller,获取Bean对象的常用三种方式
|
2月前
|
XML Java 数据格式
Spring容器Bean之XML配置方式
通过对以上内容的掌握,开发人员可以灵活地使用Spring的XML配置方式来管理应用程序的Bean,提高代码的模块化和可维护性。
73 6
|
2月前
|
XML Java 数据格式
🌱 深入Spring的心脏:Bean配置的艺术与实践 🌟
本文深入探讨了Spring框架中Bean配置的奥秘,从基本概念到XML配置文件的使用,再到静态工厂方式实例化Bean的详细步骤,通过实际代码示例帮助读者更好地理解和应用Spring的Bean配置。希望对你的Spring开发之旅有所助益。
149 3
|
3月前
|
缓存 Java Spring
实战指南:四种调整 Spring Bean 初始化顺序的方案
本文探讨了如何调整 Spring Boot 中 Bean 的初始化顺序,以满足业务需求。文章通过四种方案进行了详细分析: 1. **方案一 (@Order)**:通过 `@Order` 注解设置 Bean 的初始化顺序,但发现 `@PostConstruct` 会影响顺序。 2. **方案二 (SmartInitializingSingleton)**:在所有单例 Bean 初始化后执行额外的初始化工作,但无法精确控制特定 Bean 的顺序。 3. **方案三 (@DependsOn)**:通过 `@DependsOn` 注解指定 Bean 之间的依赖关系,成功实现顺序控制,但耦合性较高。
125 4
实战指南:四种调整 Spring Bean 初始化顺序的方案
|
2月前
|
安全 Java 开发者
Spring容器中的bean是线程安全的吗?
Spring容器中的bean默认为单例模式,多线程环境下若操作共享成员变量,易引发线程安全问题。Spring未对单例bean做线程安全处理,需开发者自行解决。通常,Spring bean(如Controller、Service、Dao)无状态变化,故多为线程安全。若涉及线程安全问题,可通过编码或设置bean作用域为prototype解决。
50 1
|
4月前
|
XML Java 数据格式
Spring从入门到入土(bean的一些子标签及注解的使用)
本文详细介绍了Spring框架中Bean的创建和使用,包括使用XML配置文件中的标签和注解来创建和管理Bean,以及如何通过构造器、Setter方法和属性注入来配置Bean。
104 9
Spring从入门到入土(bean的一些子标签及注解的使用)
|
4月前
|
Java 测试技术 Windows
咦!Spring容器里为什么没有我需要的Bean?
【10月更文挑战第11天】项目经理给小菜分配了一个紧急需求,小菜迅速搭建了一个SpringBoot项目并完成了开发。然而,启动测试时发现接口404,原因是控制器包不在默认扫描路径下。通过配置`@ComponentScan`的`basePackages`字段,解决了问题。总结:`@SpringBootApplication`默认只扫描当前包下的组件,需要扫描其他包时需配置`@ComponentScan`。