自动装配
1.ByName自动装配
<!-- byName: 会自动在容器上下文中查找,和自己对象set方法后面的值对应的 beanid! -->
<bean id="people" class="pojo.People" autowire="byName">
<property name="name" value="奥里给"/>
</bean>
2.ByType自动装配
<!-- byType:会自动在容器上下文中查找,和自己对象属性类型相同的bean! -->
<bean id="people" class="pojo.People" autowire="byType">
<property name="name" value="奥里给"/>
</bean>
byname的时候,需要保证所有bean的id唯一,并且这个bean需要和自动注入的属性的set方法的值一致!
bytype的时候,需要保证所有bean的class唯一,并且这个bean需要和自动注入的属性的类型一致!
使用注解进行自动装配(常用的注解)
1.使用注解前应先导入依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
注意:加入spring-context依赖,此依赖中包含Aop依赖,而spring注解实现需要spring-AOP。
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/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<!--声明组件扫描器
加入此标签之后,位置文件会加入spring-context.xsd约束
-->
<context:component-scan base-package="org.example.entity"></context:component-scan>
</beans>
注意:当声明组件扫描器,IDEA会更改配置文件,加入spring-context.xsd约束和context命名空间
3.常用注解展示
(1)@Component(value = “myStudent”)
@Component 等同bean id=“myStudent” class=“此类的全限定名称”
@Component :创建对象的,等同于<bean>的功能
value:就是对象的名称,创建的对象在spring容器中只有一个
位置:在类的上面
注意:
- value可省,也可为空
- @Component后面如果不指定名称,由spring提供默认的名称:类名首字母小写
(2)@Repository @Service @Controller
此三个注解和@Component 的功能基本一致,但又不同
- @Repository( 用在持久层) 可以访问数据库
- @Service(用在业务层上面) 业务处理,和事务
- @Controller(用在控制器对象) 处理请求对象
注意:一般选用以上三种进行对象的创建,如果需要创建的对象与上面的三层架构没有关系,再采用@Component
(3)@Value(value=" ")
进行简单类型的赋值
位置:属性之上或者set方法之上
@Value(value = "zhangfei")
private String name;
private Integer age;
@Value(value="20")
public void setAge(Integer age) {
System.out.println("set方法实现了");
this.age = age;
}
注意:在spring中string类型也属于简单类型
(4)@Autowired
直接在属性上使用即可!也可以在set方式上使用!
使用Autowired 我们可以不用编写Set方法了,前提是你这个自动装配的属性在 IOC(Spring)容器中存在,且符合类型byType!
public class People {
//如果显示定义了Autowired的required属性为false,说明这个对象可以为null,赋值失败了,引用类型赋值为null
//required=true :表示引用类型赋值失败,程序报错,并终止执行
@Autowired(required = false)
private Cat cat;
@Autowired
private Dog dog;
private String name;
}
(5)@Qualifier(value=" ")
如果@Autowired自动装配的环境比较复杂,自动装配无法通过一个注解【@Autowired】完成的时候、我们可以使用@Qualifier(value=“xxx”)去配置@Autowired的使用,指定一个唯一的bean对象注入!
public class People {
@Autowired
@Qualifier(value="cat111")
private Cat cat;
}
(6)@Resource
JDK提供的注解,提供自动注入,默认是byName,如果通过byName赋值失败,则会采用byType。
Spring提供了对这个注解的功能支持
@Resource
Student student;
@Value("清华大学")
String name;