依赖注入与控制反转——Spring

2019-07-26  本文已影响0人  Wilson_wad

总结

代码这东西,思想最重要,从实践开始,基于实践思考。最终作用于实践

理论部分

依赖注入:DI(Dependency Injection)。分为两部分解释

依赖注入的意思简单就是,将B的引用传入到A。(A可以自己new一个B,但是注入就是外部构造一个B再传入A

控制反转:IOC(Inversion of Control)。将资源控制权交给第三方管理,通常我们是A需要B,A是需求方,B是提供方,直接交易。但是IOC容器就是一个中介,代为管理和分配。

需求方A——卖家

提供方B——卖家

IOC——中介

控制反转依赖于(基于)DI,没有DI就没有IOC

以上都是思想,最终实现千姿百态,我选择的是目前极具代表性的Spring框架

对于属性的赋值,我把他们分为手动控制控制反转

手动控制

最常见的方法:直接new

private A a=new A();

耦合度极高,静态。修改困难,需要重新编译打包

简单工厂模式

//使用
private BookDao bookDao = DaoFactory.getInstance().createDao("zhongfucheng.dao.impl.BookDaoImpl", BookDao.class);
//工厂类
public class DaoFactory {
    private static final DaoFactory factory = new DaoFactory();
    private DaoFactory(){}
    public static DaoFactory getInstance(){
        return factory;
    }
    public <T> T createDao(String className,Class<T> clazz){
        try{
            T t = (T) Class.forName(className).newInstance();
            return t;
        }catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

耦合度降低,通过传入字符串信息进行动态加载,但依然是静态

因此将其变种,字符串信息从配置文件读取,实现动态、运行时修改。

自动注入

Spring简单入门

主要讲讲基本的概念

两种IOC容器

XmlBeanFactory两个配置文件加载方式

~注:classpath既存放.class文件的地方

注入方式

ApplicationContext简介

如何加载ApplicationContext.xml

public class App {
    public static void main(String[] args) {
        // 创建容器对象
        //ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        ApplicationContext ac=new FileSystemXmlApplicationContext("DemoSpring/applicationContext.xml");
        //得到service对象
        UserService userService = (UserService) ac.getBean("userService");
        userService.save();
    }
}

他相当于一个容器,因此根节点是<beans>二级节点是<bean>,豆荚和豆子的关系。

注册一个bean

<!--创建userDao对象-->
<!--id表示标识,class标识需要加载的类-->
<bean id="userDao" class="UserDao"/>

如何注入

构造函数注入

<!--创建userService对象-->
<bean id="userService" class="UserService">
    <!--要在userService中用userDao,必须先创建userDao-->
    <!--构造器配置,index表示第几个参数,name表示参数名,ref表示注入对象,在bean里面选-->
    <constructor-arg index="0" name="userDao" ref="userDao"/>
</bean>

setter()注入

<bean id="userService" class="UserService" >
    <!--要在userService中用userDao,必须先创建userDao-->
    <!--构造器配置,index表示第几个参数,name表示参数名,ref表示注入对象,在bean里面选-->
    <property name="userDao" ref="userDao"/>
</bean>

p命名空间

<bean id="userService" class="UserService" p:userDao-ref="userDao"/>

ide会自动在<beans>添加

<beans xmlns:p="http://www.springframework.org/schema/p" />

自动装配

通过setter()进行装配,而不是构造器

两种形式

<bean id="userService" class="UserService" autowire="MODE">

全局自动化

<beans default-autowire="MODE"/>

注解

用注解记得先扫描,如果没有扫描,那么所有注解都是失效的

<!--扫描-->
<beans><context:component-scan base-package="com"/></beans>

@AutoWired

实践部分

移步:GitHub

Reference

Spring【依赖注入】就是这么简单

上一篇 下一篇

猜你喜欢

热点阅读