原来的三层架构
servlet
sevice
dao
他们之间的依赖关系特别强,需要用ioc思想去解耦。
我们拿个简单例子去看一下以前的开发场景
UserDao
public interface UserDao {
void getUser();
}
UserDaoimpl
public class UserDaoimpl implements UserDao{
@Override
public void getUser() {
System.out.println("默认获取用户数据");
}
}
UserService
public interface UserService {
void getUser();
}
UserServiceimpl
public class UserServiceimpl implements UserService{
private UserDao userDao=new UserDaoimpl();
@Override
public void getUser() {
userDao.getUser();
}
}
servlet
public class TestIocTheory {
public static void main(String[] args) {
UserService service=new UserServiceimpl();
service.getUser();
}
}
我们和接口层是用的默认获取用户数据,突然我们有一天换数据库了,我们想用mysql去实现UserDaoimpl,然后我们需要怎么修改。我们需要从新修改代码,从新new一个MySqlDaoimpl对象。如果有大量的代码,修改源码是相当耗费资源的事情。
public class UserServiceimpl implements UserService{
//private UserDao userDao=new UserDaoimpl();
private UserDao userDao=new MySqlDaoimpl();
@Override
public void getUser() {
userDao.getUser();
}
}
此时我们需要用到这种思想,不用我们主动的去new一个对象,我们用的时候,用什么实现类,就给UserServiceimpl 注入一个UserDao实现类。修改如下。
UserServiceimpl
public class UserServiceimpl implements UserService{
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void getUser() {
userDao.getUser();
}
}
servlet (我们用哪个实现类就注入什么实现类setUserDao)
public class TestIocTheory {
public static void main(String[] args) {
UserService service = new UserServiceimpl();
((UserServiceimpl) service).setUserDao(new MySqlDaoimpl());
//((UserServiceimpl) service).setUserDao(new UserDaoimpl());
service.getUser();
}
}
我们画图看一下主动权的变化。。。。
spring中的ioc思想
原来的我们
Person p = new Person();
现在:写一个类
package com.yangzhenxu.firstspringboot.bean;
public class Dog {
private String name;
private Integer age;
public void setAge(Integer age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public Integer getAge() {
return age;
}
@Override
public String toString() {
return "Dog{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
放在ioc容器里
<?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="dog1" class="com.yangzhenxu.firstspringboot.bean.Dog">
<property name="name" value="zhangxue"/>
<property name="age" value="27"/>
</bean>
</beans>
使用(先把类注册到容器中,什么时候用什么时候拿,而不是去new)
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
Dog dog1 = (Dog) applicationContext.getBean("dog1");
System.out.println(dog1)
他这种注入用的就是set放法。我们把Dog类里的方法删除,那么我们的配置文件就会报错,因为它使用set方法注入的。