知乎专栏 |
目录
Spring框架为基于Java的现代企业级应用程序提供了全面的编程和配置模型——适用于任何类型的部署平台。
Spring框架的关键要素是应用程序级别的基础设施支持:Spring专注于企业级应用程序的“管道”,以便团队可以专注于应用程序级别的业务逻辑,而无需与特定的部署环境产生不必要的联系。
package cn.netkiller.config; import lombok.Data; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @Configuration @Data public class Config { @Bean public MyBean myBean() { return new MyBean(); } @Bean(initMethod = "init", destroyMethod = "destroy") public MyBean myBean2() { return new MyBean(); } @Bean({"myBean4", "myBean5"}) @Scope("prototype") public MyBean myBean3() { return new MyBean(); } public class MyBean { public MyBean() { System.out.println("MyBean Initializing"); } public String output() { return "Helloworld!!!"; } public void init() { System.out.println("Bean 初始化方法被调用"); } public void destroy() { System.out.println("Bean 销毁方法被调用"); } } }
查看注入情况
neo@MacBook-Pro-M2 ~/w/watch (main)> curl -s 'http://neo:chen@localhost:8080/actuator/beans' |jq | grep -i mybean -A 5 "myBean2": { "aliases": [], "scope": "singleton", "type": "cn.netkiller.config.Config$MyBean", "resource": "class path resource [cn/netkiller/config/Config.class]", "dependencies": [ "config" ] }, -- "myBean4": { "aliases": [ "myBean5" ], "scope": "prototype", "type": "cn.netkiller.config.Config$MyBean", "resource": "class path resource [cn/netkiller/config/Config.class]", "dependencies": [] }, "dbHealthContributor": { "aliases": [], -- "myBean": { "aliases": [], "scope": "singleton", "type": "cn.netkiller.config.Config$MyBean", "resource": "class path resource [cn/netkiller/config/Config.class]", "dependencies": [ "config" ] },
@Bean({"neo","netkiller"}) @Scope("prototype") public MyBean myBean(){ return new MyBean(); }
Scope 详解 singleton 默认单例的bean定义信息,对于每个IOC容器来说都是单例对象 prototype bean对象的定义为任意数量的对象实例 request bean对象的定义为一次HTTP请求的生命周期,也就是说,每个HTTP请求都有自己的bean实例,它是在单个bean定义的后面创建的。仅仅在web-aware的上下文中有效 session bean对象的定义为一次HTTP会话的生命周期。仅仅在web-aware的上下文中有效 application bean对象的定义范围在ServletContext生命周期内。仅仅在web-aware的上下文中有效 websocket bean对象的定义为WebSocket的生命周期内。仅仅在web-aware的上下文中有效
singleton和prototype 一般都用在普通的Java项目中,而request、session、application、websocket都用于web应用中。
@Bean @Scope(value = "singleton") public Person person(){ return new Person(); }
ConfigurableBeanFactory.SCOPE_PROTOTYPE,即“prototype” ConfigurableBeanFactory.SCOPE_SINGLETON,即“singleton” WebApplicationContext.SCOPE_REQUEST,即“request” WebApplicationContext.SCOPE_SESSION,即“session”
afterPropertiesSet() 在 @Value 完成之后执行
package cn.netkiller.services; import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @Service @Data @Slf4j public class TestService implements InitializingBean { private String appId; public TestService(@Value("${app.id}") String appId) { this.appId = appId; log.info(this.appId); } @Override public void afterPropertiesSet() throws Exception { log.info(this.appId); } }