美文网首页
依赖注入与控制反转——Spring

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

作者: Wilson_wad | 来源:发表于2019-07-26 14:02 被阅读0次

    总结

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

    理论部分

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

    • 依赖:A类如果需要使用B类,那么A依赖于B
    • 注入:类似于医院的注射一样

    依赖注入的意思简单就是,将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容器

    • BeanFactory
    • XmlBeanFactory:基于BeanFactory,代表角色-ApplicationContext。看名字便知道,这个类就是从xml中加载配置。(就像我上面说的工厂类及其变种)

    XmlBeanFactory两个配置文件加载方式

    • FileSystemXmlApplicationContext
    • ClassXmlAplicationContext

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

    注入方式

    • 通过构造函数
    • 通过set方法给属性注入值
    • p名称空间
    • 自动装配(了解)
    • 注解

    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>
    
    • 引用类型使用ref属性
    • 基本类型使用value属性

    p命名空间

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

    ide会自动在<beans>添加

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

    自动装配

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

    两种形式

    • byName
    • byType
    <bean id="userService" class="UserService" autowire="MODE">
    

    全局自动化

    <beans default-autowire="MODE"/>
    

    注解

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

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

    @AutoWired

    • 可以在构造器上修饰
    • 也可以在setter方法上修饰
    • 来自java的@Inject的和@AutoWired有相同的功能

    实践部分

    移步:GitHub

    Reference

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

    相关文章

      网友评论

          本文标题:依赖注入与控制反转——Spring

          本文链接:https://www.haomeiwen.com/subject/iogrrctx.html