IOC容器

a.什么是IOC

控制反转(Inversion of Control),把对象的创建和对象之间的调用过程,交给Spring进行管理

b.目的

为了使耦合度降低

 

1.IOC底层原理

xml解析,工厂模式,反射

第一步 xml配置文件,配置创建的对象

<bean id="dao" class="class.fqqa.UserDao"></bean>

第二步 有service类和dao类,创建工厂类

_1.xml解析:String classValue = class属性值;

_2.通过反射创建对象

class clazz = class.forName(classValue);

(UserDao)clazz.newInstance;

 

2.IOC接口(BeanFactory)

_1.IOC思想基于IOC容器完成,IOC容器底层就是对象工厂

_2.Spring提供IOC容器实现两种方式:(两个接口)

  __1.BeanFactory:IOC容器基本实现,是Spring内部的使用接口,不提供开发人员使用

  *加载配置文件的时候不会去创建对象,在获取(使用)对象时才去创建对象

  __2.ApplicationContext:BeanFactory接口的子接口,提供更多的功能,由开发人员使用

  *加载配置文件的时候就会吧配置文件对象进行创建

  __3.ApplicationContext接口的实现类

    FileSystemXmlApplicationContext

    classPathXmlApplicationContext

3.IOC操作Bean管理

_1.什么是bean管理

bean管理指的是两个操作:Spring创建对象,Spring注入属性

_2.bean管理的基本操作

__1.创建对象:<bean id="user" class="com.fqqa.spring5.User"></bean> 创建对象的时候默认是执行无参数构造方法完成对象创建 

  id属性:唯一标识

  class属性:类全路径

  name属性(用的不多)

__2.注入属性:

  ___1.DI:依赖注入,就是注入属性

    使用set方法注入,使用有参数构造注入

      使用有参数构造进行注入

  ___2.名称空间注入 可以简化xml配置(了解即可)

__3.xml注入其他属性

  注入null值

<property name="address">
<null/>
</property>

    注入特殊符号

<property name="address">
<value><![CDATA[<<南京>>]]></value>
</property>

  __4.注入外部bean

 

注入内部bean

<bean id="emp" class="com.fqqa.spring5.bean.Emp">
<!--设置两个普通的属性-->
<property name="ename" value="lucy"></property>
<property name="gender" value="女"></property>
<!--设置对象类型属性-->
<property name="dept">
<bean id="dept" class="com.fqqa.spring5.bean.Dept">
<property name="dname" value="财务部"></property>
</bean>
</property>
</bean>

级联赋值

 

注入集合属性

<property name="maps">
<util:map>
<entry key="JAVA" value="java"></entry>
<entry key="PYTHON" value="python"></entry>
</util:map></property>

在集合里面设置对象类型值

把集合注入部分提取出来

 

Spring有两种Bean :普通bean和 工厂bean(FactoryBean)

普通bean:在配置文件中定义bean类型就是返回类型

工厂bean:在配置文件中定义bean类型可以和返回类型不一样

 

Bean的作用域

在Spring里面创建Bean实例是单实例还是多实例(是否是同一个对象)

在Spring里面默认是单实例对象

bean标签中属性scope设置实例(singleton表示单实例,prototype表示是多实例,request ,session)

bean的生命周期:

1.通过构造器创建bean实例(无参数构造器)

postProcessBeforeInitialization()

2.为bean的属性设置值和对其他的bean引用(调用set方法)

(2.5)把bean实例传递bean后置处理器的方法

postProcessAfterInitialization()

3.调用bean的初始化的方法(需要进行配置)

(3.5)把bean实例传递bean后置处理器的方法

4.bean可以使用了(对象找到了)

5.当容器关闭时候,调用bean的销毁的方法(需要进行配置销毁的方法)

bean的后置处理器,bean的生命周期就有7步(如上)

 

xml自动装配:根据指定装配规则(属性名称(byName),属性类型(byType)),spring自动将匹配的属性值进行注入

 

<!--引入外部文件-->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!--配置连接池-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="url" value="${druid.url}" />
<property name="driverClassName" value="${druid.driverClassName}" />
<property name="username" value="${druid.userName}" />
<property name="password" value="${druid.password}" />
</bean>

注解:注解是代码的特殊表示,格式:@注解名称(属性名称=属性值,属性名称=属性值...)

使用注解,注解作用在类,方法,属性上

使用注解的目的:简化xml配置

Spring针对Bean管理中创建对象提供注解

@Component

@Service

@Controler

@Repository

 

使用注解需要导入aop.jar包

开启组件扫描:

<context:component-scan base-package="com.fqqa" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<context:component-scan base-package="com.fqqa">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

属性注入

@AutoWired   根据属性类型自动注入

@Qualifier   根据属性名称注入  : 和@AutoWired共同使用

@Resource  可以根据类型和名称注入

@Value 注入普通类型属性

 

 

完全注解开发:

1.创建配置类,替代xml配置文件

2.编写测试类(和以前有点区别)

posted on 2020-10-05 16:26  FQQa  阅读(162)  评论(0)    收藏  举报