Spring依赖注入(DI)

2020-12-28  本文已影响0人  Insecurity

IOC是一种思想,移交对象的控制权,交给spring容器,其目的就是解耦(对象的new)。DI是他的实现方式。简单来讲:就是提供可扩展性更强的代码。比如,切换一些功能的时候,实现插入即可用,而不用再去调整代码。(举例:数据库连接信息)

构造器注入(需要对应的构造函数)

通过对应的构造函数注入注入对象(核心标签就是 <constructor-arg/>)
<bean id="user" class="com.dzq.dto.User" >
        <constructor-arg name="name" value="dzq"/>
</bean>

set方式注入(需要提供get、set方法)

<bean id="userDif" class="com.dzq.dto.User">
        <property name="name" value="dzq"/>
        <property name="identity" ref="identity"/>
        <property name="books">
            <array>
                <value type="java.lang.String">西游记1</value>
                <value type="java.lang.String">西游记2</value>
            </array>
        </property>
        <property name="hobbies">
            <list>
                <value>游泳</value>
                <value>游泳2</value>
            </list>
        </property>
        <property name="games">
            <set>
                <value>LOL</value>
                <value>LOL2</value>
            </set>
        </property>
        <property name="info">
            <props >
                <prop key="sex">男</prop>
            </props>
        </property>
        <property name="relation">
            <map>
                <entry key="zs" value="朋友1"/>
                <entry key="ls" value="同学1"/>
            </map>
        </property>
    </bean>

扩展方式注入

1.p命名空间 (PS:需要引入约束,property的缩写)
2.c命名空间(PS:需要引入约束,constructor-arg的缩写)
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:c="http://www.springframework.org/schema/c"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="userP" class="com.dzq.dto.User" p:name="dzq"/>
    <bean id="userC" class = "com.dzq.dto.User" c:name="dzq"/>  

bean的作用域

通过bean scope 属性设置,(单例 singleton(默认)、原型 prototype、请求request、会话session、应用 application)

Bean的自动装配

autowire = "byType"    #通过类型查找
autowire = "byName"  #通过属性名称,查找,对应bean_id

使用注解实现自动装配

1.引入context 
2.开启注解 
  <context:annotation-config/>
@Autowired 通过反射实现的注入,不依赖set方法,先通过byname,在通过byType去查找对应的属性。
可以添加子方法上,也能直接添加到属性上

@Resource和@Autowired 的区别

@Resource @Autowired
来源 JDK Spring
优先级 byName => byType byType => byName
属性 name,type required
是否支持指定名称 支持 需要借助@Qualifier

PS:如果为空 需要添加 @Nullable 注解
如果不满足自动装配,@Autowired 需要使用 @Qualifier 指定 名称
优先级-不重要-因为当多个对象时,你只能找到唯一的那个。

使用注解开发

1.开启注解
 <context:annotation-config/>
2.开启扫描配置文件
 <context:component-scan base-package="com.dzq"/>
3.对应的实体类加上注解(相当于注入简单bean,使用@Value注入简单属性值)
@Component  =>引出webmvc 按照对应层级划分的 @Controller @Service @Repository
=>使用注解配置对应的属性 如@Scope  配置bean的作用域

4.xml和注解的最佳实现
综合使用:..暂时没有发现一个好的总结-待续

工厂模式

该环节涉及到对象的创建 引出设计模式-五大创建模式
singleton、prototype(clone)、生产工厂、抽象工厂(实现部分)、构造者模式(set方法返回this,实现链式调用)

javaconfig

以java类的方式,完全取代xml文件。
相当于在类中构建bean,而不需要在xml中去构造了。(引出springboot  自动配置的关键点)
上一篇 下一篇

猜你喜欢

热点阅读