spring_IOC编程

Posted tunan96

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring_IOC编程相关的知识,希望对你有一定的参考价值。

环境搭建

创建项目

java项目或者web项目都可以

添加jar包

添加配置文件

在项目的src下新增配置文件,文件名随意:applicationContext.xml

xml文件约束文件:dtd约束dtd文件、scheme约束xsd约束文件

<?xml version="1.0" encoding="UTF-8"?>
<beans
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop" 
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mvc=http://www.springframework.org/schema/mvc
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
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
</beans>

如何让容器(spring)帮我们创建对象?

不需要我们自己创建对象,但是以某种方式(xml配置、注解)通知容器帮我创建什么对象。

通过xml的方式通知容器创建某个对象

      在spring的配置文件中,一个bean标签表示要容器创建一个对象

 

如何获取容器中的对象

 

DI:依赖注入

方式1:set注入

前提:有属性、必须有属性的set方法

 

方式2:构造器注入

前提:有对应的参数的构造方法

 

方式3:p命名空间注入【p:property属性的缩写】

前提:有p:xxx xxx属性必须有set方法,本质是采用set注入

 

方式3:c命名空间注入【c:contructor构造器的缩写】

前提:有对应参数的构造方法,本质是构造器注入

用法同p相似

多个配置文件的处理

可以将创建多个spring的配置文件用来做容器,用来分类管理bean

比如所有的实体类的bean:spring-pojo.xml

所有dao包类的bean:spring-dao.xml

所有service包类的bean:spring-service.xml

解决方式1:多个配置文件是平等关系

 

解决方式2:多个配置文件是包含关系

定义一个总的配置文件,将其他被包含的配置文件通过<import>导入其他的配置文件

 

或者被包含的文件取名统一的规则,可以用*进行匹配,但是主配置文件命名不是这种规则,会导致出现循环包含。

 

spring容器中的bean的作用域

作用域:spirng创建的bean对象是否是单例的

单例:创建的对象都是同一个

spring中创建的bean默认都是单例的

证明:

      通过两次获取同一个bean的id,查看输出结果

 

如何自定义bean的作用域

      在bean标签中设置scope属性的值

      scope的值:

            singleton:单例

            prototype:原型,多例

            request:发起一次http请求,就会创建一个新的对象

            session:新的session创建,就会创建也给新的对象

 

spring中bean是什么时候创建的

spring中的两个容器的API

ApplicationContext:

 

BeanFactory

 

ApplicationContext和BeanFactory的区别

      区别主要在于创建bean对象的时间不同

      ApplicationContext在容器启动的过程中,就会创建需要的bean对象。【效率高、占内存】

      BeanFactory在容器启动过程中没有创建对象,当嗲用getBean方法的时候立马创建。

spring容器中bean的生命周期

1、        调用无参数构造器,创建实例实例【实例化】

2、        调用set方法,为属性注入值

3、        如果bean类实现了BeanNameAware接口,会执行setBeanName方法,可以获取bean的id的值

4、        如果bean类实现了BeanFactoryAware接口,会执行setBeanFactory方法,可以获取BeanFactory对象

5、        如果定义了bean后处理器类【写了一个类实现了BeanPostProcessor】并且在容器中进行了注册(bean标签),会执行postProcessBeforeInitialization方法

在该方法中可以获取bean对象,也可以改变对象,通过return可以改变对象

6、        如果bean类实现了InitializingBean接口,会执行afterPropertiesSet方法

7、        如果bean标签中定义了init-method属性,调用对应的属性的值的方法

8、        会执行后处理器的postProcessAfterInitialization方法

9、        通过bean对象业务

10、    如果bean类实现了DisposableBean接口,会调用destory方法

11、    注意:手动调用了容器的close方法

12、    ((ClassPathXmlApplicationContext)context1).close();

13、    如果bean标签中定义了destroy-method属性,调用对应的属性的值的方法

 

spring的ioc的注解式开发

添加jar包

spring中的aop的jar包,因为spring注解用到了aop技术

配置spring的配置文件,定义要扫描的component注解包路径

在需要创建的对象的类上面添加@Component注解【相当于配置了一个<bean>标签】

@Component  

    public class UserServiceImpl{

}

容器启动后会创建UserServiceImpl类的对象,并且bean的id设置为类名的第一个字母小写,即id=” userServiceImpl”

如果希望自定义bean的id的值,使用@Component(“id的名字”)

为对象注入依赖的属性

 

总结:

1、如何通知容器创建对象

  @Component:通用的

  @Repository:一般用在dao类上面

  @Service:一般用在service类上面

  @Controller:一般用在控制器类上面

2、如何让容器注入属性

  @Autowired:容器会根据类型自动注入

  @Autowired

  @Qualifier("d1") 容器根据bean的id进行精确的对象的注入

   

  @Resource:该注解不是spring里面的,是javaee里面的

  @Resource(name="d1")  即可根据类型注入也可以根据bean的id注入

以上是关于spring_IOC编程的主要内容,如果未能解决你的问题,请参考以下文章

Spring_IOC

zbb20170216_spring_ioc

Spring_IOC

JavaEE--Spring_IOC02

Spring_Ioc容器

Spring_IOC控制反转和DI依赖注入