spring注解开发(配置bean的作用范围与生命周期)(3)
目录
一、简单spring工程(纯注解开发)环境搭建。
(1)Maven构建。spring-context依赖坐标。
(2)dao层。
(3)配置类(SpringConfig)。
(4)测试类(AppForAnnotation)。
二、注解@Scope定义bean的作用范围。
(2)基于纯注解开发:注解@Scope("?")。
<1>设置成单例模式(singleton)。
<2>设置成非单例模式(prototype)。(原型模式)
三、注解配置bean的生命周期(init-method、destroy-method)。
(1)基于XML配置文件的bean生命周期管理。
(2)基于纯注解式的bean生命周期管理。
<1>准备init方法和destroy方法。(模拟bean生命周期方法)
<2>注解@PostConstruct与@PreDestroy。
一、简单spring工程(纯注解开发)环境搭建。
(1)Maven构建。spring-context依赖坐标。
- 在项目的pom文件中引入所需要的依赖坐标。
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.3.18</version> </dependency> </dependencies>
(2)dao层。
- 使用注解@Repository表示这个dao层的实体类,并将其交给spring管理。
- BookDao接口。
package com.fs.dao; public interface BookDao { /** * dao层save方法 */ void save(); }
- BookDaoImpl实现类。
package com.fs.dao.impl; import com.fs.dao.BookDao; import org.springframework.stereotype.Repository; @Repository public class BookDaoImpl implements BookDao { @Override public void save() { System.out.println("book dao save..."); } }
(3)配置类(SpringConfig)。
- 使用注解@Configuration标明这是一个spring的配置类。
- 使用注解@ComponentScan让其自动扫描指定包下的类的注解。
package com.fs.config; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @Configuration @ComponentScan("com.fs.dao") public class SpringConfig { }
(4)测试类(AppForAnnotation)。
- 使用类AnnotationConfigApplicationContext加载配置类初始化2个容器对象。(context1、context2)
- 2个容器对象各自调用getBean()方法获取到BookDaoImpl实现类的bean。
- 最后通过打印输出比较对象间的异与同。
package com.fs.test; import com.fs.config.SpringConfig; import com.fs.dao.BookDao; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class AppForAnnotation { public static void main(String[] args) { //加载配置类初始化容器对象 ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class); BookDao bookDao1 = context.getBean(BookDao.class); BookDao bookDao2 = context.getBean(BookDao.class); System.out.println(bookDao1); System.out.println("======================="); System.out.println(bookDao2); } }
- 当然运行结果当然是两个BookDaoImpl对象都是一样。因为spring默认管理的bean是单例的。单例的对象就是指spring工厂每次默认生产对象的只有一个且相同的。
二、注解@Scope定义bean的作用范围。
(1)基于XML配置文件:标签<bean>的属性scope。
(2)基于纯注解开发:注解@Scope("?")。
<1>设置成单例模式(singleton)。
package com.fs.dao.impl; import com.fs.dao.BookDao; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Repository; @Repository @Scope("singleton") public class BookDaoImpl implements BookDao { @Override public void save() { System.out.println("book dao save..."); } }
<2>设置成非单例模式(prototype)。(原型模式)
package com.fs.dao.impl; import com.fs.dao.BookDao; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Repository; @Repository @Scope("prototype") public class BookDaoImpl implements BookDao { @Override public void save() { System.out.println("book dao save..."); } }
三、注解配置bean的生命周期(init-method、destroy-method)。
(1)基于XML配置文件的bean生命周期管理。
- 这里就不多说。想要详细了解可以前往博主之前的博客查看。(详细讲解)
- spring学习(bean的生命周期与控制?)_spring 控制bean 生命周期-CSDN博客
(2)基于纯注解式的bean生命周期管理。
- 这里通过简单的模拟bean的初始化方法和销毁方法进行学习。
<1>准备init方法和destroy方法。(模拟bean生命周期方法)
package com.fs.dao.impl; import com.fs.dao.BookDao; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Repository; @Repository @Scope("singleton") public class BookDaoImpl implements BookDao { @Override public void save() { System.out.println("book dao save..."); } /** * 模拟初始化方法 */ public void init() { System.out.println("book init..."); } /** * 模拟销毁方法 */ public void destroy() { System.out.println("book destroy..."); } }
<2>注解@PostConstruct与@PreDestroy。
- 在之前的bean生命周期学习:通过案例的程序运行结果得知:init()初始化方法是在构造方法运行结束后才会运行。所以注解@PostConstruct看名称就能知道对应使用在初始化方法上面。
- 而对应注解@PreDestroy也就很好解释了,“彻底销毁前”的销毁方法。
/** * 模拟初始化方法 */ @PostConstruct public void init() { System.out.println("book init..."); } /** * 模拟销毁方法 */ @PreDestroy public void destroy() { System.out.println("book destroy..."); }
- 注意:bean的生命周期中想要让bean触发生命周期的destroy()方法必须关闭对应的IoC容器对象(close()方法或者设置registerShutdownHook()关闭钩子方法)
- 所以测试类还需稍加修改。(注意父接口ApplicationContext未直接提供close()方法)
- 但提供close()方法的是ConfigurableApplicationContext接口下的实现类。
package com.fs.test; import com.fs.config.SpringConfig; import com.fs.dao.BookDao; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class AppForAnnotation { public static void main(String[] args) { //加载配置类初始化容器对象 /*ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);*/ AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class); BookDao bookDao1 = context.getBean(BookDao.class); BookDao bookDao2 = context.getBean(BookDao.class); System.out.println(bookDao1); System.out.println("======================="); System.out.println(bookDao2); context.close(); } }
- 测试类修改后的运行结果。