ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

IOC编程

2019-11-02 23:55:14  阅读:194  来源: 互联网

标签:容器 配置文件 对象 spring 编程 bean 创建 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,编程,bean,创建,IOC
来源: https://www.cnblogs.com/Tunan-Ki/p/11784827.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有