Spring注解 - 生命周期、属性赋值、自动装配

软件发布|下载排行|最新软件

当前位置:首页IT学院IT技术

Spring注解 - 生命周期、属性赋值、自动装配

农夫三拳有点疼~   2020-03-18 我要评论
# 一、Bean的生命周期 ## 流程 **Bean创建 —— 初始化 —— 销毁** 创建: - 单实例:在容器启动时创建对象 - 多实例:每次调用时创建对象 初始化: - 都是在对象创建完成后,调用初始化方法 销毁: - 单实例:容器关闭时,调用销毁方法 - 多实例:容器不会管理这个bean,只能手动调用销毁方法 ## 实现方式 1. 在 @Bean 注解上指定初始化(**initMethod**)、销毁方法(**destroyMethod**) ```java @Bean(initMethod = "init", destroyMethod = "destroy") public Car car(){ return new Car(); } ``` 2. 让Bean实现 **InitializingBean** 和 **DisposableBean** 接口,重写它们的方法 ```java public class Cat implements InitializingBean, DisposableBean { public Cat() { System.out.println("Cat...Construct..."); } @Override public void afterPropertiesSet() throws Exception { System.out.println("Cat...init..."); } @Override public void destroy() throws Exception { System.out.println("Cat...destroy..."); } } ``` 3. 使用 JSR250 中的 **@PostConstruct** 和 **@PreDestroy** 注解标注初始化、销毁方法 ```java public class Dog { public Dog() { System.out.println("Dog...Construct..."); } @PostConstruct public void init(){ System.out.println("Dog...init..."); } @PreDestroy public void destroy(){ System.out.println("Dog...destroy..."); } } ``` 4. 实现BeanPostProcessor接口,重写 **postProcessBeforeInitialization**(在初始化之前工作) **postProcessAfterInitialization**(在初始化之后工作) ```java public class MyBeanPostProcessor implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println("postProcessBeforeInitialization" + beanName); return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println("postProcessAfterInitialization" + beanName); return bean; } } ``` # 二、属性赋值相关注解 ## @Value **作用:** ​ 添加在字段上,用于给属性赋值 **属性:** - value:指定要传入的值 **用法:** ```java public class Person { @Value("张三") //普通方式赋值 private String name; @Value("#{20 - 1}") //使用SpEL表达式 private Integer age; @Value("${person.nickName}") //使用 ${} 读取配置文件内容 private String nickName; //省略getter setter toString方法 } ``` 上述第三种方式显然是不能读取到的,我们需要配置一下配置文件的位置,使用到下面这个注解 ## @PropertySource **作用:** ​ 读取指定的外部配置文件,将K/V键值对保存到运行的环境变量中,用 ${} 来获取 **属性:** - name:给属性源指定一个名称 - value:要加载的配置文件的路径,可以指定多个 - ignoreResourceNotFound:是否忽略资源未找到的情况,默认false - encoding:给定资源的特定字符编码,例如 “UTF-8” - factory:指定一个自定义属性源工厂,默认使用 PropertySourceFactory **用法:** 在 resources 目录下创建一个 properties 文件,内容如下 ```properties person.nickName=小张 ``` 然后在配置类上标注 `@PropertySource("classpath:person.properties")` 即可 可以直接在@Value注解中获取,也可以通过 ioc 容器对象获取 ```java ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfiguration4.class); String nickName = context.getEnvironment().getProperty("person.nickName"); System.out.println(nickName); ``` # 三、自动装配相关注解 Spring 利用依赖注入(DI),完成对IOC容器中各个组件的依赖关系赋值 ## @Autowired - 默认按照类型去容器中寻找对应的组件,如果只有一个就赋值 - 如果找到多个相同类型的组件,再按照属性名寻找 - 有一个required属性,默认是true; - 可以写在构造器、方法、参数、属性上 ## @Qualifier - 一般配合 @Autowired 使用,指定需要装配的组件的id,@Autowired 就直接按照id注入。 - 如果 id 对应的组件不存在,并且没有指定 required = false,则会报错 ## @Primary - 让Spring进行自动装配的时候,首先选择标注了@Primary的组件 - 如果已经使用 @Qualifier 指明了要装配的组件,则不生效 ---- **

Copyright 2022 版权所有 软件发布 访问手机版

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 联系我们