控制反转(IOC):控制反转就是通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。在spring中实现控制反转的ioc容器,其实现方法是依赖注入(Dependency injection DI)
之前用户的需求发生变化时,我们需要去更改源代码。这样很不方便。
例子:有三个Dao层的类分别是
public interface UserDao {
void getUser();
}
public class UserDaoImpl implements UserDao {
@Override
public void getUser() {
System.out.println("默认获取用户数据");
}
}
public class UserDaoMysqlImpl implements UserDao{
@Override
public void getUser() {
System.out.println("mysql获取用户数据");
}
}
再有两个业务层的类:
public interface UserService {
void getUser();
}
public class UserServiceImpl implements UserService {
private UserDao userDao = new UserDaoImpl();
public void getUser() {
userDao.getUser();
}
}
测试类:
public class MyTest {
public static void main(String[] args) {
UserService userService = new UserServiceImpl();
userService.getUser();
}
}
现在输入的是:默认获取用户数据
如果用户想要使用mysql去获取用户数据,那么我们需要更改源代码才可以实现。
每当用户修改需求的时候都需要更改源代码,显然不合适。
现在我们使用一个set接口实现。这样会方便很多。
public class UserServiceImpl implements UserService {
private UserDao userDao ;
public void setUserDao(UserDao userDao){
this.userDao = userDao;
}
public void getUser() {
userDao.getUser();
}
}
使用的时候只需要set新的对象就行了
public class MyTest {
public static void main(String[] args) {
UserService userService = new UserServiceImpl();
((UserServiceImpl) userService).setUserDao(new UserDaoMysqlImpl());
userService.getUser();
}
}
这样已经发生的革命性的变化。
而使用spring的时候会更加方便:
1.写配置文件beans.xml
<?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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!--使用spring来创建对象,在spring中这些都统称为Bean-->
<!-- id= 变量名 class = new的对象 property = 属性设置-->
<bean id="UserDaoImpl" class="com.yf.dao.UserDaoImpl"></bean>
<bean id="UserDaoMysqlImpl" class="com.yf.dao.UserDaoMysqlImpl"></bean>
<bean id="UserServiceImpl" class="com.yf.service.UserServiceImpl">
<!--
ref:引用spring容器中创建好的对象
value:具体的值,基本数据类型!
-->
<property name="userDao" ref="UserDaoImpl"/>
</bean>
</beans>
注意value和ref的区别
2.获取ApplicationContext对象
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
3.通过context对象获取bean对象
UserServiceImpl userServiceImpl = (UserServiceImpl) context.getBean("UserServiceImpl");
这样就可以使用了,当用户的需求发生变化的时候,只需要更改配置文件就行了。
<bean id="UserServiceImpl" class="com.yf.service.UserServiceImpl">
<!--
ref:引用spring容器中创建好的对象
value:具体的值,基本数据类型!
-->
<property name="userDao" ref="UserDaoImpl"/>
</bean>