IOC—inversion of control 控制反转
不使用spring的情况下 实现service和dao
public class UserServiceImpl implements UserService{
private UserDao userDao=new UserDaoMySQLImpl();
@Override
public void getUser() {
userDao.getUser();
}
}
这种情况下service和dao的耦合性太强,如果UserDao的实现不再是UserDaoMySQLImpl,变更为其他的则需要更改service层代码
而使用spring后只需在UserServiceImpl类中添加set方法
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
之后可以通过spring配置文件配置bean进行注入,也可通过注解的形式注入。
这种方式即称为控制反转:原本由应用程序主动控制对象的创建,现在将控制权交给spring,应用程序被动接收创建的对象。
IOC的应用远不止这一处
如果对象之间的依赖关系过于复杂,一个对象的变化必然会影响到整个系统的稳定,而IOC容器就是来实现对象之间的解耦
对于IOC的详细解释参见特种兵—AK47的博客
IOC创建对象、依赖注入方式
1.无参构造方式
<bean id="user" class="com.entity.User">
<property name="name" value="张三"/>
</bean>
2.有参构造
//User类中设置有参构造方法
User(String name){
this.name=name;
}
1.根据参数下标
<bean id="user" class="com.entity.User">
<constructor-arg index="0" value="张三"/>
</bean>
2.根据属性名称
<bean id="user" class="com.entity.User">
<constructor-arg name="name" value="张三"/>
</bean>
3.根据参数类型
<bean id="user" class="com.entity.User">
<constructor-arg type="java.lang.String" value="张三"/>
</bean>
3.通过工厂方法创建
1.静态工厂方法
//创建UserFactory
public class UserFactory{
public static User newInstance(String name){
return new User(name);
}
//配置文件
<bean id="user" class="com.factory.UserFactory" factory-method="newInstance">
<constructor-arg type="java.lang.String" value="张三"/>
</bean>
2.动态工厂方法
//创建UserDynamicFactory
public class UserDynamicFactory{
public User newInstance(String name){
return new User(name);
}
//配置文件
<bean id="userDynamicFactory" class="com.factory.UserDynamicFactory"/>
<bean id="user" factory-bean="userDynamicFactory" factory-method="newInstance">
<constructor-arg index="0" value="张三"/>
</bean
4.setter注入
1.常量注入
<bean id="user" class="com.entity.User>
<property name="name" value="张三"/>
...
</bean>
2.bean注入
<bean id="addr" class="com.entity.Address"/>
<bean id="user" class="com.entity.User">
...
<property name="addr" ref="addr"/>
...
</bean>
3.数组注入
<bean id="user" class="com.entity.User">
...
<property name="book">
<array>
<value>西游记</value>
<value>红楼梦</value>
<value>三国演义</value>
</array>
</property>
...
</bean>
4.List注入
<bean id="user" class="com.entity.User">
...
<property name="hobbies">
<list>
<value>西游记</value>
<value>红楼梦</value>
<value>三国演义</value>
</list>
</property>
...
</bean>
5.Map注入
<bean id="user" class="com.entity.User">
...
<property name="cards">
<map>
<entry key="中国银行" value="3214123412414"/>
<entry>
<key><value>中国建设银行</value></key>
<value>412341243132</value>
</entry>
</map>
</property>
...
</bean>
6.Set注入
<bean id="user" class="com.entity.User">
...
<property name="games">
<set>
<value>LOL</value>
<value>DNF</value>
</set>
</property>
...
</bean>
7.空注入
<bean id="user" class="com.entity.User">
...
<property name="wife"><null/></property>
...
</bean>
8.Properties注入
<bean id="user" class="com.entity.User">
...
<property name="info">
<props>
<prop key="身高">178cm</prop>
<prop key="体重">70kg</prop>
</props>
</property>
...
</bean>
9.p命名空间注入
//<beans
...
xmlns:p="http//www.springframework.org/schema/p"
...
<--需设置对应的set方法-->
<bean id="user" class="com.entity.User" p:name="张三"/>
</beans>
10.c命名空间注入
```
//<beans
...
xmlns:p="http//www.springframework.org/schema/c"
...
<--需设置对应参数的构造方法-->
<bean id="user" class="com.entity.User" p:name="张三"/>
</beans>