主页 > 游戏开发  > 

spring注解开发(配置bean的作用范围与生命周期)(3)

spring注解开发(配置bean的作用范围与生命周期)(3)

目录

一、简单spring工程(纯注解开发)环境搭建。

(1)Maven构建。spring-context依赖坐标。

(2)dao层。

(3)配置类(SpringConfig)。

(4)测试类(AppForAnnotation)。

二、注解@Scope定义bean的作用范围。

(1)基于XML配置文件:标签 的属性scope。

(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(); } } 测试类修改后的运行结果。

标签:

spring注解开发(配置bean的作用范围与生命周期)(3)由讯客互联游戏开发栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“spring注解开发(配置bean的作用范围与生命周期)(3)