内容简介:1/2 高层模块不应该依赖低层模块,而是依赖抽象,低层模块也应该依赖抽象。 比如 controller 依赖 IXXXService ,而不是依赖 XXXServiceImpl。Spring可以加载来自ApplicationContext是应用程序级别,BeanFactory是系统级别。 使用 AppCtx 不同实现,比如 ClassPathXmlApplicationContext
1/2 高层模块不应该依赖低层模块,而是依赖抽象,低层模块也应该依赖抽象。 比如 controller 依赖 IXXXService ,而不是依赖 XXXServiceImpl。
DI注入方式
- 1 Setter注入
- 2 构造注入
- 3 接口注入 spring没有实现 avalon有实现
- go cloud —— wired 可能是第4种
POJO 注册成 Bean
public class DefaultMessage { private String message = "Spring is fun."; /** * Gets message. */ public String getMessage() { return message; } /** * Sets message. */ public void setMessage(String message) { this.message = message; } } 复制代码
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="message" class="org.springbyexample.di.xml.DefaultMessage" /> </beans> 复制代码
构造注入
public class ConstructorMessage { private String message = null; /** * Constructor */ public ConstructorMessage(String message) { this.message = message; } /** * Gets message. */ public String getMessage() { return message; } /** * Sets message. */ public void setMessage(String message) { this.message = message; } } 复制代码
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="message" class="org.springbyexample.di.xml.ConstructorMessage"> <constructor-arg value="Spring is fun." /> </bean> </beans> 复制代码
Setter注入
public class SetterMessage { private String message = null; /** * Gets message. */ public String getMessage() { return message; } /** * Sets message. */ public void setMessage(String message) { this.message = message; } } 复制代码
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="message" class="org.springbyexample.di.xml.SetterMessage"> <property name="message" value="Spring is fun." /> </bean> </beans> 复制代码
Bean跟Bean之间依赖
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="springMessage" class="java.lang.String"> <constructor-arg value="Spring is fun." /> </bean> <bean id="message" class="org.springbyexample.di.xml.SetterMessage"> <property name="message" ref="springMessage" /> </bean> </beans> 复制代码
从外部配置启动应用程序
Spring可以加载来自
- classpath
- file sys
- ftp
- http
- ...任何外部的配置文件
ApplicationContext是应用程序级别,BeanFactory是系统级别。 使用 AppCtx 不同实现,比如 ClassPathXmlApplicationContext
public class MessageRunner { final static Logger logger = LoggerFactory.getLogger(MessageRunner.class); /** * Main method. */ public static void main(String[] args) { logger.info("Initializing Spring context."); ApplicationContext applicationContext = new ClassPathXmlApplicationContext("/application-context.xml"); logger.info("Spring context initialized."); Message message = (Message) applicationContext.getBean("message"); logger.debug("message='" + message.getMessage() + "'"); } } 复制代码
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="message" class="org.springbyexample.di.app.Message"> <property name="message" value="Spring is fun." /> </bean> </beans> 复制代码
单元测试
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration public class SetterMessageTest { final Logger logger = LoggerFactory.getLogger(SetterMessageTest.class); @Autowired private SetterMessage message = null; /** * Tests message. */ @Test public void testMessage() { assertNotNull("Constructor message instance is null.", message); String msg = message.getMessage(); assertNotNull("Message is null.", msg); String expectedMessage = "Spring is fun."; assertEquals("Message should be '" + expectedMessage + "'.", expectedMessage, msg); logger.info("message='{}'", msg); } } 复制代码
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="message" class="org.springbyexample.di.xml.SetterMessage"> <property name="message" value="Spring is fun." /> </bean> </beans> 复制代码
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 前端项目框架搭建随笔---Webpack踩坑记
- 前端项目框架搭建随笔---Tab组件的编写
- Spring 框架核心 AOP(LTW) 概念随笔
- GO随笔-表单验证
- GO随笔-表单输入
- 2018年的一些随笔
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
程序员2010精华本
程序员杂志社 / 电子工业 / 2011-1 / 49.00元
《程序员(2010精华本)》主要内容:《程序员》创刊10年来,每年末编辑部精心打造的“合订本”已经形成一个品牌,得到广大读者的认可和喜爱。今年,《程序员》杂志内容再次进行了优化整合,除了每期推出的一个大型专题策划,各版块也纷纷以专题、策划的形式,将每月的重点进行了整合,让内容非常具有凝聚力,如专题篇、人物篇、实践篇等。另外杂志的版式、色彩方面也有了很大的飞跃,给读者带来耳目一新的阅读体验。一起来看看 《程序员2010精华本》 这本书的介绍吧!