什么是Spring Bean的自动装配?

  1. 自动装配是Spring满足bean依赖一种方式
  2. Spring会在上下文种自动寻找,并自动给bean装配属性

Spring种有三种装配方式

1.在xml种显示配置
2.隐式的自动装配bean【重要】
3.在java种显示配置

1.在xml种显示配置

1.1 创建pojo

/*** @author LongXi* @create 2021-05-28 20:24*/
public class Dog {public void shout(){System.out.println("汪汪");}
}
/*** @author LongXi* @create 2021-05-28 20:24*/
public class Cat {public void shout(){System.out.println("喵喵~");}
}
/*** @author LongXi* @create 2021-05-28 20:26*/
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;}
}

人有2个宠物,狗和猫,都会叫。

bean.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="cat" class="com.lx.pojo.Cat"/><bean id="dog" class="com.lx.pojo.Dog"/><bean id="people" class="com.lx.pojo.People"><property name="dog" ref="dog"/><property name="cat" ref="cat"/><property name="name" value="龙兮"/></bean></beans>

测试类

/*** @author LongXi* @create 2021-05-28 20:32*/
public class MyTest {@Testpublic void  Test1(){ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");People people = context.getBean("people", People.class);people.getCat().shout();people.getDog().shout();}
}

结果

下面我们改一下配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="cat" class="com.lx.pojo.Cat"/><bean id="dog" class="com.lx.pojo.Dog"/><bean id="people" class="com.lx.pojo.People" autowire="byName"><property name="name" value="龙兮"/></bean></beans

测试

byName:会自动在容器上下文种查找和自己对象set方法后面的值对应bean id。有就注入,没有报错。

再改一下配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="cat" class="com.lx.pojo.Cat"/><bean id="dog11" class="com.lx.pojo.Dog"/><bean id="people" class="com.lx.pojo.People" autowire="byType"><property name="name" value="龙兮"/></bean></beans>

测试

byType:会自动在容器上下文种查找和自己对象属性类型相同的Bean。
保证类型全局唯一才会装配,否则报错。
并且bean的id可以省略

        <bean class="com.lx.pojo.Cat"/><bean class="com.lx.pojo.Dog"/><bean id="people" class="com.lx.pojo.People" autowire="byType"><property name="name" value="龙兮"/></bean>

这样也是可以的

总结:
byName:需要保证bean的id全局唯一,并且这个bean需要和自动注入属性的set方法的值一致。
byType:需要保证bean的Class全局唯一,并且这个bean需要和自动注入属性的类型一致!

2.使用注解实现自动装配
1.导入约束 :context
2.配置注解的支持: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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsd"><bean id="cat" class="com.lx.pojo.Cat"/><bean id="dog" class="com.lx.pojo.Dog"/><bean id="people" class="com.lx.pojo.People"/><context:annotation-config/>
</beans>

实体类

/*** @author LongXi* @create 2021-05-28 20:26*/
public class People {@Autowiredprivate Cat cat;@Autowiredprivate Dog dog;private String name;
}

测试:

@Autowired
1.直接在对象的属性上使用即可,也可以在set方法上使用。
2.使用Autowired我们可以不用编写set方法了,前提是你这个自动装配的属性在IOC(spring)容器种存在,且符合名字byName。

附加:
@Nullable 字段加了这个注解,说明这个字段可以为null

public @interface Autowired {boolean required() default true;
}
************************************************@Autowired(required = false)private Cat cat;

如果对象种属性显示定义了required = false,说明这个属性可以null,否则不允许为空。

如果@Autowired自动装配环境比较复杂,自动装配无法通过一个注解【@Autowired】完成的时候,
我们可以使用@Qualified(value=xxx)去配和@Autowired,指定一个唯一的bean对象注入。

    <bean id="dog" class="com.lx.pojo.Dog"/><bean id="dog22" class="com.lx.pojo.Dog"/>
    @Autowired@Qualifier(value = "dog22")private Dog dog;

@Resource:java的原生注解

    <bean id="cat" class="com.lx.pojo.Cat"/><bean id="cat2" class="com.lx.pojo.Cat"/>
**********************************************@Resource(name = "cat2")private Cat cat;

先按名称装配,再按类型装配,可以有多个类型一样的不同name,可以指定唯一name

总结:@Resource和@Autowired区别

  1. 都是用来自动装配的,都可以放在属性字段上
  2. @Autowired用过byType的方式实现,如果找不到类型,则通过byName实现。而且必须要求这个对象存在。【常用】
  3. @Resource默认通过byName的方式实现,如果找不到名称,则通过byType实现!
  4. 执行顺序不同:@Autowired用过byType的方式实现,@Resource默认通过byName的方式实现

使用注解开发
在Spring4之后,要使用注解开发,必须要保证aop的包导入了

使用注解需要导入context约束,增加注解的支持。

1.bean
2.属性如何注入

<?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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsd"><!--指定要扫描的包,这个包下的注解就会生效--><context:component-scan base-package="com.lx.pojo"/><context:annotation-config/>
</beans>
@Component
public class User {@Value("龙兮")public String name;//@Value("龙兮")public String getName() {return name;}
}

3.衍生的注解
@Compoent 有几个衍生注解,我们在web开发种,会按照mvc三层架构分层!

  1. dao 【@Repository】
  2. service【@Service】
  3. controller【@Controller】
    这四个注解功能都是一样的,都是代表将某个类注册到Spring容器中,装配bean。
    4.自动装配的注解
    @Autowired
    @Resource
    5.作用域
/*** @author LongXi* @create 2021-05-28 22:45*/
@Controller
@Scope("prototype")
public class UserController {}

6.总结:
xml:更加万能,使用于任何场合,维护简单方便。
注解:不是自己的类使用不了,维护相对复杂。
最佳实践:
xml用来管理bean
注解只负责完成属性的注入。
我们在使用的过程中,只需要注意一个问题:必须让注解生效 ,需要开启注解的支持。

    <!--指定要扫描的包,这个包下的注解就会生效--><context:component-scan base-package="com.lx"/><context:annotation-config/>

3.使用Java的方式配置Spring

我们现在完全不使用Spring的xml配置了,全权交给java来做。
JavaConfig是Spring的一个子项目,在Spring4之后,它成为了一个核心功能。

实体类:

/*** @author LongXi* @create 2021-05-30 9:07*/
//这个注解的意思,就是说明这个类配托管了
@Component
public class User {private String name;@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +'}';}public String getName() {return name;}@Value("龙兮")public void setName(String name) {this.name = name;}
}

配置类

/*** @author LongXi* @create 2021-05-30 9:09*/
//这个也会被Spring容器过关,注册到容器中,因为它本来就是一个@Compoent
//@Configuration 代表这是一个配置类,就和我们之前看的beans。xml是一样的
@Configuration
@ComponentScan("com.lx.pojo")
@Import(MyConfig2.class)
public class MyConfig {//注册一个bean,就相当于我们之前写的Bean标签//这个方法的名字,就相当于bean标签的ID属性//这个方法的放回置,就相当于bean标签的class属性//@Beanpublic User getUser(){return  new User();//就是放回要注入的bean对象}
}

测试类

/*** @author LongXi* @create 2021-05-30 9:11*/
public class MyTest {@Testpublic void MyTest1(){//如果完全使用了配置类方式,我们只能通过AnnotationConfigApplicationContext上下文来获取容器,通过配置的class对象加载ApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);User user = context.getBean("getUser", User.class);System.out.println(user.getName());}
}

这中纯java的配置方式,在SpringBoot中随处可见!

Spring之 Bean的自动装配相关推荐

  1. Spring之Bean的自动装配

    Spring从入门到精通–(4)Spring之Bean的自动装配 作者:进击攻城狮 个人主页:欢迎访问我的主页 首发时间:2022年8月5日星期五 订阅专栏:Spring入门到精通 个人信条:星光不问 ...

  2. 详解Spring中Bean的自动装配~

    目录 1. 环境搭建 2. byName.byType 3. 使用注解实现自动装配 @Autowired @Resource 小结 自动装配是Spring满足bean依赖的一种方式 Spring会在上 ...

  3. Spring的Bean的自动装配属性autowire

    Spring自动注入 使用元素的 autowire 属性为一个 bean 定义指定自动装配模式 autowire设置值 no:没开启 byName: 根据bean的id名称,注入到对应的属性里面 by ...

  4. 请解释Spring Bean 的自动装配?

    在Spring 框架中,在配置文件中设定bean 的依赖关系是一个很好的机制,Spring 容器还可以自动装配合作关系bean 之间的关联关系.这意味着Spring 可以通过向Bean Factory ...

  5. Spring精华问答 | Spring Bean的自动装配是怎么回事?

    戳蓝字"CSDN云计算"关注我们哦! Spring框架是由于软件开发的复杂性而创建的.Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情.然而,Sprin ...

  6. Spring基础——在 Spring Config 文件中基于 XML 的 Bean 的自动装配

    一.Spring IOC 容器支持自动装配 Bean,所谓自动装配是指,不需要通过 <property> 或 <constructor-arg> 为 Bean 的属性注入值的过 ...

  7. [Spring]Bean的自动装配

    Spring支持5种自动装配模式,如下: 1.no --默认情况下,不自动装配,通过"ref"attribute手动设定. 2.buName --根据Property的Name自动 ...

  8. [Spring实战系列](12)Bean的自动装配

    Spring提供了4种各具特色的自动装配策略: 类型 说明 no 默认方式,Bean的引用必须通过XML文件中的</ref>元素或者ref属性手动设定. byName 把与Bean的属性具 ...

  9. 万字详解! Spring Bean的自动装配

    点击上方 Java学习之道,选择 设为星标 每天18点,干货准时奉上! 何为自动装配 自动装配是 Spring 满足 bean 依赖的一种方式. 在使用 Spring 配置 bean 时,我们都要给配 ...

最新文章

  1. placeholder插件详解
  2. 打印SAP Spartacus generic link指向的url
  3. MVC Scaffolding SmartCode-Engine 更新
  4. 来自阿里巴巴佛系安卓程序员的指南,专题解析
  5. LeetCode 625. 最小因式分解(贪心)
  6. 论文浅尝 | 以知识图谱为基础的开放域对话生成的目标规划
  7. Keras-6 IMDB, a binary classification example
  8. 解决安装MarkupSafe安装 from setuptools import Feature 报错ImportError: cannot import name ‘Feature‘
  9. Java 读取txt文件,读取结果保存到数据库
  10. 美国空军学习编程,为五角大楼节省了上百万!
  11. 如何将footer标签固定在底部_如何让footer标签置于页面最底部
  12. ❤️使用Mybatis对数据库进行增删改查!!!
  13. shell基础(下) 特殊符号
  14. 使用 Python 多处理库处理 3D 数据
  15. html,实现心动的表白代码
  16. relativePath
  17. Docker推送一个自制镜像到dockerhub
  18. 解方程组的意义和过程 - Strang MIT 18.06 线性代数精髓 2
  19. 复选框全部选中/全部取消
  20. http://localhost/myphpsite/index.php

热门文章

  1. php提供了什么来实现反射,php提供实现反射的方法和实例代码
  2. java tomcat 教程_从零开始学习 JavaWeb - 02Tomcat教程
  3. VS和IIS的一些问题
  4. CF788E:New task
  5. PHP 规划(收藏的一些好博文)
  6. 从svn下载下来的项目遇到的问题
  7. 编译hibernate源代码
  8. 查看一个进程对应的端口号
  9. sharepoint webpart
  10. Delphi用指针读取数组某个元素