Spring设置注入与构造器注入
1、Spring框架简介(摘自百度百科)
Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性角度而言,绝大部分Java应用都可以从Spring中受益。
◆目的:解决企业应用开发的复杂性
◆功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能
◆范围:任何Java应用
Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架。
2、这里介绍一下spring的liang两种注入方式
I 设置输入方式
例如通过xml文件配置方式配置beans
<?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="injectionService" class="me.timlong.spring.service.impl.InjectionServiceImpl">
<property name="injectionDAO" ref="injectionDAO"></property>
</bean>
<bean id="injectionDAO" class="me.timlong.spring.dao.impl.InjectionDAOImpl"></bean>
</beans>
IInjectionDAOImpl.java代码:
package me.timlong.spring.dao.impl;
import me.timlong.spring.dao.IInjectionDAO;
public class InjectionDAOImpl implements IInjectionDAO {
@Override
public void save(String arg) {
//模拟数据库保存操作
System.out.println("保存数据: " + arg);
}
}
InjectionServiceImpl.java代码:
package me.timlong.spring.service.impl;
import me.timlong.spring.dao.IInjectionDAO;
import me.timlong.spring.dao.impl.InjectionDAOImpl;
import me.timlong.spring.service.IInjectionService;
public class InjectionServiceImpl implements IInjectionService {
private IInjectionDAO injectionDAO = new InjectionDAOImpl();
//设值注入
public void setinjectionDAO(IInjectionDAO idi) {
this.injectionDAO = idi;
}
//构造器注入
public InjectionServiceImpl(InjectionDAOImpl injectionDAO) {
this.injectionDAO = injectionDAO;
}
@Override
public void save(String arg) {
//模拟业务操作
System.out.println("Service接收参数:" + arg);
arg += ":" + this.hashCode();
this.injectionDAO.save(arg);
}
}
使用JUnit4测试代码测试赋值注入:
测试类基类UnitTestBase.java代码:
package me.timlong.spring.base;
import org.junit.After;
import org.junit.Before;
import org.junit.runner.RunWith;
import org.junit.runners.BlockJUnit4ClassRunner;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.util.StringUtils;
@RunWith(BlockJUnit4ClassRunner.class)
public class UnitTestBase {
private ClassPathXmlApplicationContext context;
private String springXmlPath;
public UnitTestBase(String path) {
this.springXmlPath = path;
}
@Before
public void before() {
if(StringUtils.isEmpty(springXmlPath)) {
springXmlPath = "classpath*:spring-*.xml";
}
context = new ClassPathXmlApplicationContext(this.springXmlPath);
context.start();
}
@After
public void after() {
context.destroy();
}
@SuppressWarnings("unchecked")
protected <T extends Object> T getBean(String beanId) {
return (T)context.getBean(beanId);
}
protected <T extends Object> T getBean(Class<T> clazz) {
return this.context.getBean(clazz);
}
}
测试类子类InjectionServiceImplTest.java代码:
package me.timlong.spring.service.impl;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.BlockJUnit4ClassRunner;
import me.timlong.spring.base.UnitTestBase;
@RunWith(BlockJUnit4ClassRunner.class)
public class InjectionServiceImplTest extends UnitTestBase{
public InjectionServiceImplTest() {
super("resources/spring-injection.xml");
}
@Test
public void testConstructor() {//构造器中的参数名必须与类中的变量名保持一致
InjectionServiceImpl isi = super.getBean("injectionService");
isi.save("这是要保存的值value");
}
}
最终运行结果:
II 类似地,spring的构造器注入方式只需要更改些许配置文件,如下:
<?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="injectionService" class="me.timlong.spring.service.impl.InjectionServiceImpl">
<constructor-arg name="injectionDAO" ref="injectionDAO"></constructor-arg>
</bean>
<bean id="injectionDAO" class="me.timlong.spring.dao.impl.InjectionDAOImpl"></bean>
</beans>
代码部分同上,最终运行结果亦同上。
3、spring的IoC,把创建对象的权利交给框架,是框架的重要特征,并非面向对象编程的专用术语。它包括依赖注入(Dependency Injection,简称DI)和依赖查找(Dependency Lookup),极大地方便了用户编程。
纸上得来终觉浅,绝知此事要躬行!望每一天进步一点,