Spring学习笔记-IOC

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>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值