Spring注解驱动开发系列:
Spring注解驱动开发2:生命周期和属性赋值
@Bean指定初始化和销毁方法
Bean的生命周期:bean的创建==>初始化==>销毁
在上一篇文章中,bean的生命周期都由spring容器管理,
我们可以自定义bean的初始化和销毁方法,容器在bean进行到当前生命周期的时候来调用我们自定义的初始化和销毁方法。
例子
编写UserDao代码如下:
public class UserDao {
public UserDao() {
System.out.println("UserDao 构造函数");
}
public void init() {
System.out.println("userdao init....");
}
public void destory() {
System.out.println("userdao destory...");
}
}
编写MainTest代码如下:
public class MainTest {
public static void main(String[] args) {
AnnotationConfigApplicationContext applicationContext = new
AnnotationConfigApplicationContext(MainConfigure.class);
UserDao userDao = (UserDao) applicationContext.getBean("userDao");
applicationContext.close();
}
}
执行MainTest得到输出:
UserDao 构造函数
userdao init....
userdao destory...
自定义的初始化和销毁方法都成功执行。
BeanPostProcessor-bean的后置处理器
在Bean初始化前后进行一些处理工作。
例子
编写MyBeanPostProcessor,代码如下:
@Component
public class MyBeanPostProcessor implements BeanPostProcessor {
//在bean初始化之前执行
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof UserDao) {
System.out.println("process 执行init");
((UserDao) bean).init();
}
return bean;
}
//在bean初始化之后执行
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof UserDao) {
System.out.println("process 执行destory");
((UserDao) bean).destory();
}
return bean;
}
}
编写配置文件MainConfigure如下:
//配置类==配置文件
@Configuration
//开启自动包扫描,传入要扫描的包路径
@ComponentScan(basePackages = "com.lin.springL")
public class MainConfigure {
}
编写MainTest代码如下:
public class MainTest {
public static void main(String[] args) {
AnnotationConfigApplicationContext applicationContext = new
AnnotationConfigApplicationContext(MainConfigure.class);
}
}
执行得到结果:
UserDao 构造函数
process 执行init
userdao init....
process 执行destory
userdao destory...
自定义的MyBeanPostProcessor在bean的初始化前后分别被调用。
扩展
在Spring底层,使用了很多BeanPostProcessor来对Bean进行增强,像生成代理对象,或者对一些注释进行处理来增强bean的功能。
例如@Autowired这个注解,可以在后置处理器中对其注释的属性进行赋值。
@Value-赋值
对Bean中的属性进行赋值操作。
例子
编写User类为如下代码:
@Component
public class User {
@Value("lin")
private String name;
@Value("23")
private int age;
public User() {
}
...
编写MainTest为如下代码:
public class MainTest {
public static void main(String[] args) {
AnnotationConfigApplicationContext applicationContext = new
AnnotationConfigApplicationContext(MainConfigure.class);
User user = (User) applicationContext.getBean("user");
System.out.println(user);
}
}
运行得到输出如下:
User{name='lin', age=23}
可以看到在Bean创建的时候根据Value设置的值为初始值。
@PropertySource-加载外部配置文件
如果值需要从外部文件读入,可以在MainConfigure文件中加入注解@PropertySource来加载外部配置文件。
例子
更改MainConfigure文件的代码如下:
//配置类==配置文件
@Configuration
//开启自动包扫描,传入要扫描的包路径
@ComponentScan(basePackages = "com.lin.springL")
//加载外部文件
@PropertySource(value = "路径")
public class MainConfigure {
}
然后使用上面提到的@Value注解,通过${}
从配置文件中取值。