Spring与IoC-day02

 

IoCInversion of Control控制反转。将原本由代码操纵的对象操控权,交由第三方容器,即反转给了第三方容器。这种对象的依赖关系管理方式,称为IoC

IoC是一种思想,是一个概念。其实现方式很多,较著名的有两种:

DLDependency Lookup依赖查找。其典型应用是JNDIJava Naming and Directory InterfaceJava名称与服务接口。其实JNDI,就是一个第三方的容器

DIDependency Injection依赖注入。是目前最优秀的解耦方式。其典型应用是Spring。

1.1 Bean的装配

Bean的装配,简单来说,就是对象的创建。容器根据代码的要求,创建好对象后,再将对象传递给代码的过程,就是Bean的装配。

1.1.1 默认装配方式

默认装配方式指,容器调用Bean类的无参构造器创建对象。

(1) 修改接口实现类

 

 

(2) 修改配置文件

 

 

(3) 修改测试类

 

 

1.1.2 动态工厂Bean

(1) 定义工厂类

 

 

(2) 修改配置文件

 

 

(3) 修改测试类

 

1.1.3 静态工厂Bean

(1) 修改工厂类

 

(2) 修改配置文件

 

(3) 修改测试类

 

1.1.4 Bean的作用范围

(1) 修改接口实现类

 

 

 

(2) 修改配置文件

 

 

(3) 修改测试

 

 

1.1.5 Bean后处理器

(1) 基本原理

A、 定义Bean后处理器类

 

 

B、 修改配置文件

 

 

C、 修改测试类

 

 

(2) Bean后处理器用法示例

 

 

 

 

1.1.6 定制Bean的生命周期始末

(1) 实现类

 

 

(2) 测试类

 

 

 

1.1.7 Bean的生命周期(了解)

 

 

 

 

1.1.8 Bean标签的idname属性

就像身份证号和人名的区别,每个bean的id(身份证号)都不同,但可以有相同的name (人名)。 id属性命名必须满足XML的命名规范,因为id其实是XML中就做了限定的。 name属性则没有这些限定,你可以使用几乎任何的名称。

 

 

 

1.2 基于XMLDI

DI,依赖注入,即为属性赋值。

1.2.1 注入分类

注入分为三类:设值注入、构造注入与实现特定接口注入。

(1) 设值注入

调用相关属性的set方法完成的赋值过程,称为设值注入。

 

 

 

(2) 构造注入

调用相关的构造器完成的对象创建及初始化过程,称为构造注入。

 

 

 

1.2.2 命名空间注入(不常用)

 

 

 

 

 

(1) p命名空间设值注入----设置注入

 

<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"

    xsi:schemaLocation="http://www.springframework.org/schema/beans

        http://www.springframework.org/schema/beans/spring-beans.xsd">

 

    <bean name="classic" class="com.example.ExampleBean">

        <property name="email" value="foo@bar.com"/>

    </bean>

 

    <bean name="p-namespace" class="com.example.ExampleBean"

        p:email="foo@bar.com"/>

</beans>

(2) c命名空间构造注入---构造注入

 

 

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    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="bar" class="x.y.Bar"/>
    <bean id="baz" class="x.y.Baz"/>
    <!-- traditional declaration -->
    <bean id="foo" class="x.y.Foo">
        <constructor-arg ref="bar"/>
        <constructor-arg ref="baz"/>
        <constructor-arg value="foo@bar.com"/>
    </bean>
    <!-- c-namespace declaration -->
    <bean id="foo" class="x.y.Foo" c:bar-ref="bar" c:baz-ref="baz" c:email="foo@bar.com"/>
</beans>

  

1.2.3 数组与集合属性注入(不常用)

 

注入数组对象

 

 

字符串

 

 

Listset

 

 

Mapproperties最特殊

 

 

 test

 

 

 

简洁版

 

 

一个可以,两个就不行

 

 

1.2.4 域属性的自动注入

常用的域属性自动注入有两类:

l byName:系统会从容器中查找与域属性同名的bean,将其自动注入

l byType:系统会从容器中查找与域属性类型具有is-a关系bean,将其自动注入。与域属性类型具有is-a关系的Bean不能多于一个。

(1) byName

 

 

(2) byType

 

 

 

1.2.5 SPEL注入

SPELSpring Expression表达 LanguageSpring EL表达式。

El只能读出数据,不能写入数据,只能在四大域中读取

 

 

Expression parsing failed; nested exception is org.springframework.expression.spel.SpelEvaluationException: EL1008E:

Property or field 'pname' cannot be found on object of type 'com.abc.di09.Person' - maybe not public?

 

 

 

1.2.6 内部Bean注入(了解)

 

 

 

 

1.2.7 同类抽象Bean注入(了解)

 

 

 

 

 

 

1.2.8 异类抽象Bean注入(了解)

 

 

 

异类抽象bean

 

 

1.2.9 为应用指定多个Spring配置文件

(1) 平等关系

 

 

 

(2) 包含关系

 

 

 

 

 

 

1.3 基于注解的DI

1.3.1 环境搭建

(1) 导入AOPJar

(2) 在配置文件添加context约束

 

 

Caused by: java.lang.NoClassDefFoundError: org/springframework/aop/TargetSource

(3) 在配置文件注册组件扫描器

 

 

Application.Xml文件中添加

 

 

1.3.2 DI的基本注解

(1) @Component

@Service

@Repository

@Controller

 

 

(2) @Value

(3) 域属性注入注解

@Autowired : byType

@Autowired@QualifierbyName,两者同时存在

@Resource:  JSR250

 

 

(4) 其它注解

@Scope

@AfterInit

@PreDestroy

注解注入不需要set方法,也不是构造方法,是注解的注入。

(5) XML配置与注解的优先级

XML配置的优先级高于注解。

1.3.3 JavaConfig

使用Java类作为Spring容器,管理Bean的生命周期,及Bean间的依赖关系。

 

 

1.3.4 SpringJUnit测试

posted @ 2018-08-29 00:18  深沉有点事  阅读(195)  评论(0编辑  收藏  举报