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编程的主要内容,如果未能解决你的问题,请参考以下文章