文章目录
IOC
1.set注入
由于用户的需求可能会影响我们原来的代码,我们需要根据需求去修改源代码,如果代码量十分大,修改一次的成本代价十分昂贵!
我们可以使用一个Set接口实现
private UserDao userDao;
//使用set进行动态实现值的注入
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
-
之前,程序是主动创建对象,控制权在程序猿手上
-
使用Set注入以后,程序不再具有主动性,而是变成了被动的接受对象。
这种思想,从本质上解决了问题,不用再去管对象的创建了,系统的耦合性大大降低,可以更加专注在业务的实现上,这就是IOC的原型。
2.Ioc本质
-
控制反转Ioc(Inversion of Control)是一种设计思想,DI(依赖注入)是实现IOC的一种方法。
-
使用控制反转后,对象的创建有程序自己控变成将对象的创建交给第三方。
- IOC是spring的核心内容
- spring容器初始化先读取配置文件,根据配置文件或元数据创建与组织对象存到IOC容器中,需要时从里面取。
总而言之,控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。在spring中实现控制反转的是IOC容器,实现的方法是依赖注入(Dependency Injection,DI)
hellospring
1.applicationContext.xml
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
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="..." class="...">
<!-- collaborators and configuration for this bean go here -->
</bean>
<bean id="..." class="...">
<!-- collaborators and configuration for this bean go here -->
</bean>
</beans>
bean
<bean id="hello" class="com.kuang.pojo.Hello">
<property name="str" value="Spring"/>
</bean>
- bean:在spring 中创建的对象
- id:变量名
- class:需要new的对象
- property:给对象中的属性设置一个值
将bean交给spring管理,这个过程就叫控制反转。
控制:对象是由spring创建的,而不是程序本身。
反转:程序本身不创建对象,转变成被动的接受对象。
依赖注入:本质是利用set方法注入。
IOC是一种编程思想,由主动的编程编程被动的接受。
2.案例
dao
package com.kuang.dao;
public interface UserDao {
public void getUser();
}
dao实现类
- UserDaoImpl
package com.kuang.dao;
public class UserDaoImpl implements UserDao{
public void getUser() {
System.out.println("默认获取用户的数据");
}
}
- UserDaoMysqlImpl
package com.kuang.dao;
public class UserDaoMysqlImpl implements UserDao{
public void getUser(){
System.out.println("Mysql获取用户数据");
}
}
- UserDaoOracleImpl
package com.kuang.dao;
public class UserDaoOracleImpl implements UserDao{
public void getUser(){
System.out.println("Oracle获取用户数据");
}
}
service
package com.kuang.service;
import com.kuang.dao.UserDao;
public interface UserService {
void setUserDao(UserDao userDao);
void getUser();
}
service实现类
package com.kuang.service;
import com.kuang.dao.UserDao;
import com.kuang.dao.UserDaoImpl;
import com.kuang.dao.UserDaoMysqlImpl;
public class UserServiceImpl implements UserService{
private UserDao userDao;
//使用set进行动态实现值的注入
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void getUser() {
userDao.getUser();
}
}
resource
bean.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
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="mysqlImpl" class="com.kuang.dao.UserDaoMysqlImpl"/>
<bean id="oracleImpl" class="com.kuang.dao.UserDaoOracleImpl"/>
<bean id="UserServiceImpl" class="com.kuang.service.UserServiceImpl">
<property name="userDao" ref="oracleImpl"/>
<!-- ref:引用spring容器中创建好的对象-->
<!-- value:具体的值,基本数据类型-->
</bean>
</beans>
test
MyTest
import com.kuang.service.UserServiceImpl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest {
public static void main(String[] args){
//获取ApplicationContext;拿到spring容器
ApplicationContext context=new ClassPathXmlApplicationContext("beans.xml");
UserServiceImpl userServiceImpl=(UserServiceImpl) context.getBean("UserServiceImpl");
userServiceImpl.getUser();
}
}
运行结果
要实现不同的操作,只需要修改xml文件中bean的属性值就可以了!