Spring的Bean管理(注解方式)
1.使用注解定义Bean
- Spring2.5 引入使用注解去定义Bean
- @Component 描述Spring框架中Bean
1.1导入spring-aop依赖
完整的pom.xml的<dependencies>的标签:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
<!--需要其他的另加-->
</dependencies>
1.2配置applicationContext.xml:
1.2.1引入约束
<?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 https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!-- bean definitions here -->
</beans>
1.2.2.开启配置文件里的注解扫描
<!-- 开启注解扫描 -->
<!-- base-package属性用来指定对项目下哪个包开启注解扫描 -->
<context:component-scan base-package="com.springioc.demo1"/>
测试
在demo1包下创建一个Person.java:
package com.springioc.demo1;
import org.springframework.stereotype.Component;
//括号里的值相当于<bean id="" class=""/>中的id属性值
@Component("person")
public class Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
测试代码:
@Test
public void testPerson() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
Person person = (Person) applicationContext.getBean("person");
person.setName("张三");
person.setAge(20);
System.out.println(person);
}
2.注解定义其他Bean
- 除了@Component外,Spring提供了3个功能基本和@Component等效的
注解 - @Repository 用于对DAO实现类进行标注
- @Service 用于对Service实现类进行标注
- @Controller 用于对Controller实现类进行标注
这三个注解是为了让标注类本身的用途清晰,Spring在后续版本会对其增强
3.使用注解对Bean属性注入
3.1简单数据类型的属性注入
例如
...
@Value("饭")
private String food;
public void eat() {
System.out.println("吃" + food);
...
如果有set方法,也可以吧注释加在set上
private String food;
@Value("饭")
public void setFood(String food) {
this.food = food;
}
public void eat() {
System.out.println("吃" + food);
}
3.2.属性值的对象的属性注入
例如需要在UserService类中注入UserDao类
- 使用@Autowired 进行自动注入
- @Autowired 默认按照类型进行注入
- 如果存在两个相同Bean类型相同,则按照名称注入
- @Autowired注入时可以针对成员变量或者set方法
@Service("userService")
public class UserService {
@Autowired
private UserDao userDao;
public void save() {
System.out.println("Service中保存用户...");
userDao.save();
}
}
@Repository("userDao")
public class UserDao {
public void save() {
System.out.println("Dao中保存用户...");
}
}
3.2.1.如果需要按照名称注入
方法一
- 通过@Autowired的required属性,设置一定要找到匹配的Bean
- @Autowired(required=true):当使用@Autowired注解的时候,其实默认就是@Autowired(required=true),表示注入的时候,该bean必须存在,否则就会注入失败。
- @Autowired(required=false):表示忽略当前要注入的bean,如果有直接注入,没有跳过,不会报错。
- 使用@Qualifier指定注入Bean的名称
- 使用Qualifier 指定Bean名称后,注解Bean必须指定相同名称
@Service("userService")
public class UserService {
@Autowired(required = false)
@Qualifier("userDao")
private UserDao userDao;
public void save() {
System.out.println("Service中保存用户...");
userDao.save();
}
}
@Repository("userDao")
public class UserDao {
public void save() {
System.out.println("Dao中保存用户...");
}
}
方法二
- Spring提供对JSR-250中定义@Resource标准注解的支持
- @Resource和@Autowired注解功能相似
@Service("userService")
public class UserService {
@Resource(name = "userDao")
private UserDao userDao;
public void save() {
System.out.println("Service中保存用户...");
userDao.save();
}
}
@Repository("userDao")
public class UserDao {
public void save() {
System.out.println("Dao中保存用户...");
}
}
4.其他注解
Spring初始化bean或销毁bean时,有时需要作一些处理工作,因此spring可以在创建和拆卸bean的时候调用bean的两个生命周期方法。
4.1.Bean的生命周期相关注释
配置bean的xml是这样写的
<bean id="person" class="com.springioc.demo3.Person" init-method="init" destroy-method="destroy"/>
init-method 属性指定初始化方法,相当于用注释@PostConstruct
destroy-method 属性指定摧毁方法,相当于用注释@PreDestroy
用法
@Component("bean")
public class Bean {
@PostConstruct
public void init() {
System.out.println("init-method");
}
public void say() {
System.out.println("hello");
}
@PreDestroy
public void destory() {
System.out.println("destroy-method");
}
}
4.1.Bean的作用域相关注释
- 使用注解配置的Bean和配置的一样,默认作用范围都是singleton
- @Scope注解用于指定Bean的作用范围
用法:
@Component("demo")
@Scope("prototype")
public class Demo {
}
5.传统XML配置和注解配置混合使用
- XML方式的优势
- 结构清晰,易于阅读
• 注解方式的优势
- 结构清晰,易于阅读
- 开发便捷,属性注入方便
一般类交给xml管理,用注解属性注入
- XML与注解的整合开发
- 1、引入context命名空间
- 2、在配置文件中添加context:annotation-config标签<context:annotation-config/>,开启注解方式属性注入