spring和IOC

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的一种方法。

  • 使用控制反转后,对象的创建有程序自己控变成将对象的创建交给第三方。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wbpYwmaA-1610705079912)(spring.assets/image-20210115153704343.png)]

  • 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();
    }
}

运行结果

[外链图片转存中...(img-mo41DhmO-1610705079913)]

要实现不同的操作,只需要修改xml文件中bean的属性值就可以了!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值