近段时间正在学习spring。对于spring IOC发表一下自己的见解
1 spring IoC
1.1 什么是IoC
控制反转(Inversion of Control,英文缩写为IoC)。主要是用来降低程序之间耦合度的一种方式。
1.2 IoC主要形式
◇依赖查找:容器提供回调接口和上下文条件给组件。组件就必须使用容器提供的API来查找资源和协作对象,容器将调用这些回调方法,从而让应用代码获得相关资源。
◇依赖注入:组件不做定位查询,只提供普通的Java方法让容器去决定依赖关系。容器全权负责的组件的装配,它会把符合依赖关系的对象通过JavaBean属性或者构造函数传递给需要的对象。
*通过JavaBean属性注射依赖关系的做法称为设值方法注入(Setter Injection);
*将依赖关系作为构造函数参数传入的做法称为构造器注入(Constructor Injection)
1.3 IoC的优缺点
优点
把对象生成放在xml配置文件中,当我们需要修改某些对象时候,只需要在xml中进行操作,
降低了程序之间的耦合度。缺点
在程序编写时候可能增加步骤。
通过反射机制影响效率。
修改类文件后操作比较繁琐。
2 具体小案例
2.1 编写Dao类
public interface UserDao {
public void getUser();
}
2.2 编写impl类
public class UserImpl implements UserDao {
private String name;
private String password;
public UserImpl(String name) {
super();
this.name = name;
}
public UserImpl(String name, String password) {
super();
this.name = name;
this.password = password;
}
@Override
public String toString() {
return "username="+name+" password="+password;
}
@Override
public void getUser() {
System.out.println(toString());
}
}
2.3 编写service接口
public interface UserService {
public void showservice();
}
2.4 service实现类
public class UserServiceImpl implements UserService {
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void showService() {
userDao.getUser();
}
}
2.5 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="user" class="com.jsu.dao.Impl.UserImpl">
<constructor-arg index="0" value="zhangsan"/>
<constructor-arg index="1" value="123"/>
</bean>
<!--只有一个参数的构造方法-->
<bean id="user1" class="com.jsu.dao.Impl.UserImpl">
<constructor-arg value="张三"/>
</bean>
<bean id="service" class="com.jsu.service.serviceImpl.UserServiceImpl">
<property name="userDao" ref="user1"/>
</bean>
<!--配置别名-->
<alias name="service" alias="sc"/>
<!--id是唯一的 此时name 相当于别名
name 可用空格 逗号 分号 分割
假如没配置id 则获取直接获取name
constructor-arg 当只有一个时候 直接输入value
当有多个时候需要用下标指定
-->
<bean id="users" name="user3" class="com.jsu.dao.Impl.UserImpl">
<constructor-arg value="lisi"/>
</bean>
</beans>
2.6 测试类
public class SpirngTest {
public static void main(String[] args) {
//解析xml文件
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
//获取对象
UserService service = (UserService) context.getBean("service");
service.showService();
}
}
2.7 结果
控制台输出:
username=zhangsan password=123
通过上述案例
我们可以发现本来要在service中创建对象的任务
转交给了xml配置文件
这样降低了程序之间的耦合度