spring 学习2-Spring Configuration in detail

简介:

1.Bean Life-Cycle Management

 

Xml代码   收藏代码
  1. <bean id="simpleBean1"   
  2. class="com.apress.prospring3.ch5.lifecycle.SimpleBean"   
  3. init-method="init" />   

 

Xml代码   收藏代码
  1. <bean id="destructiveBean"   
  2. class="com.apress.prospring3.ch5.lifecycle.DestructiveBean"   
  3. destroy-method="destroy"/>  

 

Java代码   收藏代码
  1. public class SimpleBeanWithInterface implements InitializingBean{   
  2. private static final String DEFAULT_NAME = "Luke Skywalker";   
  3. private String name = null;   
  4. private int age = Integer.MIN_VALUE;   
  5. public void setName(String name) {   
  6. this.name = name;   
  7. }   
  8. public void setAge(int age) {   
  9. this.age = age;   
  10. }   
  11. public void myInit() {   
  12. System.out.println("My Init");   
  13. }   
  14. public void afterPropertiesSet() throws Exception {   
  15. System.out.println("Initializing bean");   
  16. if (name == null) {   
  17. System.out.println("Using default name");   
  18. name = DEFAULT_NAME;   
  19. }   

 

Java代码   收藏代码
  1. public class DestructiveBeanWithInterface implements InitializingBean,   
  2. DisposableBean{   
  3. private InputStream is = null;   
  4. public String filePath = null;   
  5. public void afterPropertiesSet() throws Exception {   
  6. System.out.println("Initializing Bean");   
  7. if (filePath == null) {   
  8. throw new IllegalArgumentException(   
  9. "You must specify the filePath property of " + DestructiveBean.class);   
  10. }   
  11. is = new FileInputStream(filePath);   
  12. }   
  13. public void destroy() {   
  14. System.out.println("Destroying Bean");   
  15. if (is != null) {   
  16. try {    
  17. is.close();   
  18. is = null;   
  19. catch (IOException ex) {   
  20. System.err.println("WARN: An IOException occured"   
  21. " trying to close the InputStream");   
  22. }   
  23. }   
  24. }   
  25. public void setFilePath(String filePath) {   
  26. this.filePath = filePath;   
  27. }  

 

Java代码   收藏代码
  1. public class SimpleBeanWithJSR250 {   
  2. // Codes omitted   
  3. @PostConstruct   
  4. public void init() throws Exception {   
  5. // Rest of codes omitted   
  6. }   
  7. }   

 

Java代码   收藏代码
  1. public class DestructiveBeanWithJSR250 {   
  2. private InputStream is = null;   
  3. public String filePath = null;   
  4. @PostConstruct   
  5. public void afterPropertiesSet() throws Exception {   
  6. System.out.println("Initializing Bean");   
  7. if (filePath == null) {   
  8. throw new IllegalArgumentException(   
  9. "You must specify the filePath property of " + DestructiveBean.class);   
  10. }   
  11. is = new FileInputStream(filePath);   
  12. }   
  13. @PreDestroy   
  14. public void destroy() {   
  15. System.out.println("Destroying Bean");   
  16. if (is != null) {   
  17. try {   
  18. is.close();   
  19. is = null;   
  20. catch (IOException ex) {   
  21. System.err.println("WARN: An IOException occured"   
  22. " trying to close the InputStream");   
  23. }   
  24. }   
  25. }   
  26. public void setFilePath(String filePath) {   
  27. this.filePath = filePath;   
  28. }   

 2.Making Your Beans “spring Aware”

 

 

Java代码   收藏代码
  1. public class ShutdownHookBean implements ApplicationContextAware {   
  2. private ApplicationContext ctx;   
  3. public void setApplicationContext(ApplicationContext ctx)   
  4. throws BeansException {   
  5. if (ctx instanceof GenericApplicationContext) {   
  6. ((GenericApplicationContext) ctx).registerShutdownHook();   
  7. }   
  8. }   
  9. }   

 

Xml代码   收藏代码
  1. <bean id="destructiveBean"   
  2. class="com.apress.prospring3.ch5.lifecycle.DestructiveBeanWithInterface">   
  3. <property name="filePath">   
  4. <value>d:/temp/test.txt</value>   
  5. </property>   
  6. </bean>   
  7. <bean id="shutdownHook"   
  8. class="com.apress.prospring3.ch5.interaction.ShutdownHookBean"/>   

 3.Using ApplicationContext and MessageSource 

 

 

Java代码   收藏代码
  1. public static void main(String[] args) {   
  2. GenericXmlApplicationContext ctx = new GenericXmlApplicationContext();   
  3. ctx.load("classpath:appContext/messageSource.xml");   
  4. ctx.refresh();   
  5. Locale english = Locale.ENGLISH;   
  6. Locale czech = new Locale("cs""CZ");   
  7. System.out.println(ctx.getMessage("msg"null, english));   
  8. System.out.println(ctx.getMessage("msg"null, czech));   
  9. System.out.println(ctx.getMessage("nameMsg"new Object[] { "Clarence",   
  10. "Ho" }, english));   
  11. }   
Xml代码   收藏代码
  1. <bean id="messageSource"   
  2. class="org.springframework.context.support.ResourceBundleMessageSource">   
  3. <property name="basenames">   
  4. <list>   
  5. <value>buttons</value>   
  6. <value>labels</value>   
  7. </list>   
  8. </property>   
  9. </bean>   
  10.    

 

 4.Using Application Events 

 

 

Java代码   收藏代码
  1. public class MessageEvent extends ApplicationEvent {   
  2. private String msg;   
  3. public MessageEvent(Object source, String msg) {   
  4. super(source);   
  5. this.msg = msg;   
  6. }   
  7. public String getMessage() {   
  8. return msg;   
  9. }   
  10. }   

 

Java代码   收藏代码
  1. public class MessageEventListener implements ApplicationListener<MessageEvent> {   
  2. public void onApplicationEvent(MessageEvent event) {   
  3. MessageEvent msgEvt = (MessageEvent) event;   
  4. System.out.println("Received: " + msgEvt.getMessage());   
  5. }   
  6. }   

 

Java代码   收藏代码
  1. public class Publisher implements ApplicationContextAware {   
  2. private ApplicationContext ctx;   
  3. public static void main(String[] args) {   
  4. ApplicationContext ctx = new ClassPathXmlApplicationContext(   
  5. "classpath:events/events.xml");   
  6. Publisher pub = (Publisher) ctx.getBean("publisher");   
  7. pub.publish("Hello World!");   
  8. pub.publish("The quick brown fox jumped over the lazy dog");   
  9. }   
  10. public void setApplicationContext(ApplicationContext applicationContext)   
  11. throws BeansException {   
  12. this.ctx = applicationContext;   
  13. }   
  14. public void publish(String message) {   
  15. ctx.publishEvent(new MessageEvent(this, message));   
  16. }   
  17. }  

 

Xml代码   收藏代码
  1. <bean id="publisher" class="com.apress.prospring3.ch5.event.Publisher"/>   
  2. <bean id="messageEventListener"   
  3. class="com.apress.prospring3.ch5.event.MessageEventListener"/>  

 5.Accessing Resources

Java代码   收藏代码
  1. public static void main(String[] args) throws Exception{   
  2. ApplicationContext ctx = new ClassPathXmlApplicationContext(   
  3. "classpath:events/events.xml");   
  4. Resource res1 = ctx.getResource("file:///d:/temp/test.txt");   
  5. displayInfo(res1);   
  6. Resource res2 = ctx.getResource("classpath:test.txt");   
  7. displayInfo(res2);   
  8. Resource res3 = ctx.getResource("http://www.google.co.uk");   
  9. displayInfo(res3);   
  10. }   
  11. private static void displayInfo(Resource res) throws Exception{   
  12. System.out.println(res.getClass());   
  13. System.out.println(res.getURL().getContent());   
  14. System.out.println("");   
  15. //getFile(), getInputStream(), or getURL()  
  16. }  
  17. <strong>6. Java Configuration  
  18. </strong>  
Java代码   收藏代码
  1. @Configuration   
  2. public class AppConfig {   
  3. // XML:   
  4. // <bean id="messageProvider"   
  5. class="com.apress.prospring3.ch5.javaconfig.ConfigurableMessageProvider"/>   
  6. @Bean   
  7. public MessageProvider messageProvider() {   
  8. return new ConfigurableMessageProvider();   
  9. }   
  10. // XML:   
  11. // <bean id="messageRenderer"   
  12. class="com.apress.prospring3.ch5.javaconfig.StandardOutMessageRenderer"   
  13. // p:messageProvider-ref="messageProvider"/>   
  14. @Bean   
  15. public MessageRenderer messageRenderer() {   
  16. MessageRenderer renderer = new StandardOutMessageRenderer();   
  17. // Setter injection   
  18. renderer.setMessageProvider(messageProvider());   
  19. return renderer;   
  20. }   
Java代码   收藏代码
  1. <strong>   
  2. </strong>  

 

Java代码   收藏代码
  1. @Configuration   
  2. @Import(OtherConfig.class)   
  3. // XML: <import resource="classpath:events/events.xml")   
  4. @ImportResource(value="classpath:events/events.xml")   
  5. // XML: <context:property-placeholder location="classpath:message.properties"/>   
  6. @PropertySource(value="classpath:message.properties")   
  7. // XML: <context:component-scan base-package="com.apress.prospring3.ch5.context"/>   
  8. @ComponentScan(basePackages={"com.apress.prospring3.ch5.context"})   
  9. @EnableTransactionManagement public class AppConfig {   
  10. @Autowired   
  11. Environment env;   
  12. // XML:   
  13. // <bean id="messageProvider"   
  14. class="com.apress.prospring3.ch5.javaconfig.ConfigurableMessageProvider"/>   
  15. @Bean   
  16. @Lazy(value=true//XML <bean .... lazy-init="true"/>   
  17. public MessageProvider messageProvider() {   
  18. // Constructor injection   
  19. return new ConfigurableMessageProvider(env.getProperty("message"));   
  20. }   
  21. // XML:   
  22. // <bean id="messageRenderer"   
  23. class="com.apress.prospring3.ch5.javaconfig.StandardOutMessageRenderer"   
  24. // p:messageProvider-ref="messageProvider"/>   
  25. @Bean(name="messageRenderer")   
  26. @Scope(value="prototype"// XML: <bean ... scope="prototype"/>   
  27. @DependsOn(value="messageProvider"// XML: <bean ... depends-on="messageProvider"/>   
  28. public MessageRenderer messageRenderer() {   
  29. MessageRenderer renderer = new StandardOutMessageRenderer();   
  30. // Setter injection   
  31. renderer.setMessageProvider(messageProvider());   
  32. return renderer;   
  33. }   
  34. }   

 7.ConfigurableEnvironment env = ctx.getEnvironment(); 

MutablePropertySources propertySources = env.getPropertySources(); 

8.JSR-330

Java代码   收藏代码
  1. @Named("messageRenderer")   
  2. @Singleton   
  3. public class StandardOutMessageRenderer implements MessageRenderer {   
  4. @Inject   
  5. @Named("messageProvider")   
  6. private MessageProvider messageProvider = null;   
  7. public void render() {   
  8. if (messageProvider == null) {   
  9. throw new RuntimeException(   
  10. "You must set the property messageProvider of class:"   
  11. + StandardOutMessageRenderer.class.getName());   
  12. }   
  13. System.out.println(messageProvider.getMessage());   
  14. }   
  15. public void setMessageProvider(MessageProvider provider) {   
  16. this.messageProvider = provider;   
  17. }   
  18. public MessageProvider getMessageProvider() {   
  19. return this.messageProvider;   
  20. }   
  21. }   
目录
相关文章
|
12天前
|
前端开发 Java 数据库
SpringBoot学习
【10月更文挑战第7天】Spring学习
31 9
|
13天前
|
XML Java 数据格式
Spring学习
【10月更文挑战第6天】Spring学习
17 1
|
18天前
|
Java 测试技术 开发者
springboot学习四:Spring Boot profile多环境配置、devtools热部署
这篇文章主要介绍了如何在Spring Boot中进行多环境配置以及如何整合DevTools实现热部署,以提高开发效率。
39 2
|
18天前
|
前端开发 Java 程序员
springboot 学习十五:Spring Boot 优雅的集成Swagger2、Knife4j
这篇文章是关于如何在Spring Boot项目中集成Swagger2和Knife4j来生成和美化API接口文档的详细教程。
39 1
|
18天前
|
Java API Spring
springboot学习七:Spring Boot2.x 拦截器基础入门&实战项目场景实现
这篇文章是关于Spring Boot 2.x中拦截器的入门教程和实战项目场景实现的详细指南。
14 0
springboot学习七:Spring Boot2.x 拦截器基础入门&实战项目场景实现
|
18天前
|
Java API Spring
springboot学习六:Spring Boot2.x 过滤器基础入门&实战项目场景实现
这篇文章是关于Spring Boot 2.x中过滤器的基础知识和实战项目应用的教程。
16 0
springboot学习六:Spring Boot2.x 过滤器基础入门&实战项目场景实现
|
18天前
|
Java 关系型数据库 MySQL
springboot学习五:springboot整合Mybatis 连接 mysql数据库
这篇文章是关于如何使用Spring Boot整合MyBatis来连接MySQL数据库,并进行基本的增删改查操作的教程。
29 0
springboot学习五:springboot整合Mybatis 连接 mysql数据库
|
18天前
|
Java 关系型数据库 MySQL
springboot学习四:springboot链接mysql数据库,使用JdbcTemplate 操作mysql
这篇文章是关于如何使用Spring Boot框架通过JdbcTemplate操作MySQL数据库的教程。
17 0
springboot学习四:springboot链接mysql数据库,使用JdbcTemplate 操作mysql
|
18天前
|
Java 测试技术 Spring
springboot学习三:Spring Boot 配置文件语法、静态工具类读取配置文件、静态工具类读取配置文件
这篇文章介绍了Spring Boot中配置文件的语法、如何读取配置文件以及如何通过静态工具类读取配置文件。
21 0
springboot学习三:Spring Boot 配置文件语法、静态工具类读取配置文件、静态工具类读取配置文件
|
18天前
|
Java Maven Spring
springboot学习一:idea社区版本创建springboot项目的三种方式(第三种为主)
这篇文章介绍了在IntelliJ IDEA社区版中创建Spring Boot项目的三种方法,特别强调了第三种方法的详细步骤。
67 0
springboot学习一:idea社区版本创建springboot项目的三种方式(第三种为主)