「学习笔记」Spring–IoC注解实现
1. 回顾xml方式管理Java Bean
- 将一个Bean交由Spring创建并管理
<baen id="bean" class="包名.Bean"></baen>
- 获取Spring上下文
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
- 获取Bean
Bean bean = app.getBean("bean", Bean.class);
2. 注解方式管理Java Bean
一、创建一个class配置文件
@Configuration
public class MyConfiguration{
//将一个Bean交由Spring创建并管理
@Bean(name="bean1")
public Bean bean(){
return Bean = new Bean();
}
}
二、获取Spring上下文
ApplicationContext context =
new AnnotationConfigApplicationContext(MyConfiguration.class);
三、获取Bean
Bean1 bean1 = context.getBean("bean1", Bean1.class);
2.1 简化注解方式的步骤1
一、 开启组件扫描(去掉上述步骤1中MyConfiguration实例化Bean的方法)
@Configuration //该注解可理解当前class等同于一个xml文件
@ComponentScan("包路径") //开启组件扫描
public class MyConfiguration{}
在applicationContext.xml中开启组件扫描方式
<context:component-scan base-package="包路径"/>。
二、 将交由Spring管理的类加上@Component注解,或(@Repository,@Controller,@Service)
@Component("bean1")//通过构造方法实例化Bean1
public class Bean1{
//...
}
@Component是通用注解,其他三个注解是这个注解的拓展,并且具有了特定的功能
- @Repository注解在持久层中,具有将数据库操作抛出的原生异常翻译转化为spring的持久层异常的功能。
- @Controller层是spring-mvc的注解,具有将请求进行转发,重定向的功能。
- @Service层是业务逻辑层注解,这个注解只是标注该类处于业务逻辑层。
2.2 Bean别名
一、 xml形式:通过name属性或alias标签
<bean id="bean1" name="bean2,bean3" class="com...Bean"/>
<alias name="bean1" alias="bean4"/>
二、 注解形式
@Configuration
public class MyConfiguration{
@Bean(name={"bean1","bean2","bean3"})
public Bean1 bean1(){
return Bean1 = new Bean1();
}
}
注意:@Component只能指定一个名字,@Component默认值为类名首字母小写,也可以自定义,如:
@Component("bean1"); 默认@scope为singleton单例,也可以进行指定
3. 注解方式Bean的注入
一、 @Value("值"):常用于基本数据类型值注入,值可用EL表达式。
@Component
public class Player{
@Value("张三")
private String name;
//...
}
二、 @Autowired:常用于复杂类型值的注入
+ @Autowired:可以用在成员变量,setter方法,构造方法上;优先按照类型进行匹配,匹配不上启用名字进行匹配。
+ @Qualifier("名字") 根据名字匹配,配合@Autowired,不能用在构造方法上;@Qualifier指定对象必须存在,否则程序报错,可以使用@Autowired的required属性来解除这种强依赖,@Autowired(required=false):尽量去找,组件不存在也不报错。
+ @Autowired的原理:在启动spring IoC时,容器自动装载了一个AutowiredAnnotationBeanPostProcessor后置处理器,当容器扫描到@Autowied、@Resource或@Inject时,就会在IoC容器自动查找需要的bean,并装配给该对象的属性
@Component
public class Player{
@Value("张三")
private String name;
/** 用于成员变量 */
//@Autowired
//@Qualifier("card1")
private Card card;
/** 用于构造方法 */
//@Autowired
public Player(Card card) {
super();
this.card = card;
}
/** 用于setter方法 */
@Autowired(required=false)
public void setCard(Card card) {
this.card = card;
}
}
三、 @Resource:常用于复杂类型值的注入
+ @Resource:用在成员变量和setter方法上,是JDK1.6支持的注解,优先按照名字匹配,可以通过@Resource(name="名")指定;如果没有指定name属性,用在成员变量上默认取字段名,用在setter方法上默认取属性名进行装配。名字匹配不上,会动用类型匹配。但注意:如果name属性一旦指定,就只会按照名称进行装配。
@Component
public class Player{
@Resource(name="card")
private Card card;
//...
}
集合类型值注入实例
@Configuration
@ComponentScan("包路径")
public class MyConfiguration{
@Bean
public List<String> list(){
List<String> list = new ArrayList<String>();
list.add("aaa");
list.add("bbb");
return list;
}
}
@Component
public class Player{
@Autowired
private List<String> list;
//...
}
4. 注解方式Bean的常用配置项(作用域,生命周期,懒加载等)
4.1 注解方式Bean的作用域
@Configuration
@ComponentScan("包路径")
public class MyConfiguration{
@Bean(name="bean1")
@Scope("singleton")
public Bean1 bean1(){
return Bean1 = new Bean1();
}
}
@Component
@Scope("singleton")
public class Bean{}
4.2 注解方式Bean的懒加载
@Configuration
@ComponentScan("包路径")
@Lazy //相当于xml中default-lazy-init="true"
public class MyConfiguration{
@Bean(name="bean1")
@Lazy
public Bean1 bean1(){
return Bean1 = new Bean1();
}
}
@Component
@Lazy
public class Bean{}
4.3 Bean初始化和销毁
一、实现InitializingBean和DisposableBean接口(xml和注解都支持)。
public class Bean implements InitializingBean{
@Override
public void afterPropertiesSet(){
//执行一些初始化后的工作
}
}
public class Bean implements DisposableBean{
@Override
public void destroy(){
//执行一些销毁前的工作
}
}
二、xml形式
public class Bean{
public void init(){
//执行一些初始化后的工作
}
public void cleanup(){
//执行一些销毁前的工作
}
}
<bean id="bean" class="example.Bean"
init-method="init"
destroy-method="cleanup"></bean>
三、注解形式1,@Bean(initMethod=“init”, destroyMethod=“cleanup”)
public class Bean{
public void init(){
//执行一些初始化后的工作
}
public void cleanup(){
//执行一些销毁前的工作
}
}
@Configuration
public class MyConfiguration{
@Bean(initMethod="init", destroyMethod="cleanup")
public Bean bean(){
return new Bean();
}
}
四、注解形式2,添加@PostConstruct,@PreDestroy
@Component
public class Bean{
@PostConstruct
public void init(){
//执行一些初始化后的工作
}
@PreDestroy
public void cleanup(){
//执行一些销毁前的工作
}
}
相关系列文章
- 「学习笔记」SpringCloud(五)OpenFeign整合Sentinel实现熔断降级
- 「学习笔记」SpringCloud(四)OpenFeign服务间调用
- 「学习笔记」SpringCloud(三)Config配置中心
- 「学习笔记」SpringCloud(二)Gateway网关
- 「学习笔记」SpringCloud(一)Eureka注册中心
- 「学习笔记」Spring Reactive Stack(六)响应式 HTTP 请求客户端 WebClient
- 「学习笔记」Spring Reactive Stack(五)服务端事件推送Server-Sent Events
- 「学习笔记」Spring Reactive Stack(四)响应式方式访问Redis
- 「学习笔记」Spring Reactive Stack(三)使用R2DBC访问MySQL
- 「学习笔记」Spring Reactive Stack(二)Reactor异常处理
- 「学习笔记」Spring Reactive Stack(一)Spring WebFlux响应式Web框架入门
- 「工程实践」Spring Boot - 使用RocketMQ实战样例
- 「工程实践」RocketMQ安装并整合SpringBoot
- 「工程实践」Spring Boot + Thymeleaf页面静态化实现
- 「工程实践」Spring Boot - Java接口幂等性设计
- 「工程实践」Spring Boot 整合 FastDFS
- 「学习笔记」Spring Boot MVC 应用
- 「学习笔记」Spring Boot 数据库访问
- 「学习笔记」Spring Boot 入门
- 「学习笔记」Spring--SSM框架整合(Spring+SpringMVC+MyBatis)
- 「学习笔记」Spring--持久层框架Mybatis
- 「学习笔记」Spring--MVC框架
- 「学习笔记」Spring--面向切面编程(AOP模块)
- 「学习笔记」Spring--事务管理
- 「学习笔记」Spring--JDBC详解
- 「学习笔记」Spring--IoC注解实现
- 「学习笔记」Spring--IoC控制反转