初学Spring,首先接触的就是IOC(控制反转)和DI(依赖注入)。那什么是IOC和DI呢?
Spring框架的一些jar包
这里面后面四个包是Spring的核心jar包。前两个是处理java日志的,我也是个初学者,也不太明白他的作用。
IOC
IOC:控制反转,将创建对象的能力交给Spring
我们先定义一个接口UserService 然后再实现这个接口UserServiceImpl
public interface UserService {
public void save();
}
public class UserServiceImpl implements UserService {
@Override
public void save() {
// TODO Auto-generated method stub
System.out.println("方法已经被执行...");
}
}
我们再写一个测试类 来实现这个方法(整个测试类就不贴上来了,把方法贴上来)
public void demo1() {
UserService userService = new UserServiceImpl();
userService.save();
}
我们在demo1这个方法里面,我们先是面向接口编程,新建了一个UserServiceImpl的对象
然后调用类里面save方法
我们可以看到,接口和实现类是耦合的,如果我们更改了业务,我们就必须修改测试类里面的代码
但如果我们使用ioc,我们就可以解耦,将创建对象的过程交给Spring,这个过程是由一个BeanFactory来实现的
上面是传统的方法,下面我们使用ioc来实现
配置文件:applicationContext.xml (一般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="UserService" class="com.spring.demo1.UserServiceImpl">
</bean>
</beans>
配置文件里面 bean 标签就是将实现类UserServiceImpl命名为UserService
public void demo2() {
// 创建spring的工厂 并且在工厂中加载配置文件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
// 使用配置文件 创建对象
UserService userService = (UserService) applicationContext.getBean("UserService");
userService.save();
}
如果我们需要更改业务,我们则不需要更改源代码,我们只需要把配置文件中bean标签中的class换成需要更改的那个class。因为我们是通过配置文件来更改创建的对象的。
DI
DI:依赖注入,必须拥有IOC的环境,Spring管理类的时候将类的依赖的属性注入进来。
我们现在更改实现类,在save中输出一个成员变量name
public class UserServiceImpl implements UserService {
private String name;
public void setName(String name) {
this.name = name;
}
@Override
public void save() {
// TODO Auto-generated method stub
System.out.println("方法已经被执行..." + name);
}
}
传统方法实现
public void demo1() {
UserServiceImpl userService = new UserServiceImpl();
// 这里不能再面向接口编程了,因为 userservice里面没有setname这个方法
userService.setName("李东");
userService.save();
}
使用DI
更改配置文件,在配置文件中添加属性
<bean id="UserService" class="com.spring.demo1.UserServiceImpl">
<property name="name" value="李东"></property>
</bean>
到这里就结束了,不需要更改测试类里面的源代码了,因为name的值直接通过配置文件注入进去了。