IOC:Inversion of Control 控制反转. 指的是 对象的创建权反转(交给)给Spring.
作用是实现了程序的解耦合.
1.IOC和DI:
IOC :控制反转,将对象的创建权交给了Spring.
DI :Dependency Injection 依赖注入.需要有IOC的环境,Spring创建这个类的过程中,Spring将类的依赖的属性设置进去.
例如:如果UserServiceImpl的实现类中有一个属性,那么使用Spring框架的IOC功能时,可以通过依赖注入把该属性的值传入进来!!
具体的配置如下
<bean id="us" class="com.itheima.demo1.UserServiceImpl">
<property name="uname" value="小风"/> </bean>2.Spring框架的属性注入
1. 对于类成员变量,常用的注入方式有两种
构造函数注入 属性setter方法注入3. BeanFactory和ApplicationContext的区别:
BeanFactory :是在getBean的时候才会生成类的实例.
ApplicationContext :在加载applicationContext.xml时候就会创建.
4.Spring中<bean>标签的配置
1. id属性和name属性的区别
id -- Bean起个名字,在约束中采用ID的约束,唯一 取值要求:必须以字母开始,可以使用字母、数字、连字符、下划线、句话、冒号 id:不能出现特殊字符 name -- Bean起个名字,没有采用ID的约束(了解) 取值要求:name:出现特殊字符.如果<bean>没有id的话 , name可以当做id使用 2. class属性 -- Bean对象的全路径 3. scope属性 -- scope属性代表Bean的作用范围 singleton -- 单例(默认值) prototype -- 多例,在Spring框架整合Struts2框架的时候,Action类也需要交给Spring做管理,配置把Action类配置成多例!! request -- 应用在Web项目中,每次HTTP请求都会创建一个新的Bean session -- 应用在Web项目中,同一个HTTP Session 共享一个Bean globalsession -- 应用在Web项目中,多服务器间的session 4. Bean对象的创建和销毁的两个属性配置 说明:Spring初始化bean或销毁bean时,有时需要作一些处理工作,因此spring可以在创建和拆卸bean的时候调用bean的两个生命周期方法 init-method -- 当bean被载入到容器的时候调用init-method属性指定的方法 destroy-method -- 当bean从容器中删除的时候调用destroy-method属性指定的方法5.Spring 的相关配置文件只加载一次 其中Bean对象默认单例原因?
思考:启动web服务器时,创建ServletContext对象(这个对象服务器启动只创建一次,服务器宕机才被销毁),Spring的监听器ContextLoaderListener监听ServletContext对象的创建,执行方法加载applicationContext.xml配置文件,加载一次,对象已经被创建好了。(需要使用Web工厂的方式WebApplicationContext)
org.springframework.web.context.ContextLoaderListener contextConfigLocation classpath:applicationContext.xml
6.Spring框架的IOC之注解方式
1.在applicationContext.xml配置文件中开启组件扫描
Spring的注解开发:组件扫描 <context:component-scan base-package="com.fff"/>2.在l例如UserServiceImpl的实现类上添加注解
@Component(value="userService") -- 相当于在XML的配置方式中 <bean id="userService" class="...">3.Spring框架中Bean管理的常用注解
1. @Component:组件.(作用在类上)
2. Spring中提供@Component的三个衍生注解:(功能是一致的) @Controller -- 作用在WEB层 @Service -- 作用在业务层 @Repository -- 作用在持久层 说明:这三个注解是为了让标注类本身的用途清晰 3. 属性注入的注解(说明:使用注解注入的方式,可以不用提供set方法) 如果是注入的普通类型,可以使用value注解 @Value -- 用于注入普通类型 如果注入的是对象类型,使用如下注解 @Autowired -- 默认按类型进行自动装配 如果想按名称注入 @Qualifier -- 强制使用名称注入 @Resource -- 相当于@Autowired和@Qualifier一起使用 强调:Java提供的注解 属性使用name属性7.Bean的生命周期:
答:跟对象的生命周期实质上是一致的,大概分为三个阶段:
1.实例化(为bean对象开辟空间)
2.初始化(对对象的属性进行依赖注入,使用setter方法)
3.销毁
具体来讲的话分为这些:
1. 实例化一个Bean,也就是我们通常说的new,默认为单例
2. 按照Spring上下文对实例化的Bean进行配置,也就是IOC注入
3. 如果这个Bean实现了BeanNameAware接口,会调用它实现的setBeanName(String beanId)方法,此处传递的是Spring配置文件中Bean的ID
4. 如果这个Bean实现了BeanFactoryAware接口,会调用它实现的setBeanFactory(),传递的是Spring工厂本身(可以用这个方法获取到其他Bean)
5. 如果这个Bean实现了ApplicationContextAware接口,会调用setApplicationContext(ApplicationContext)方法,传入Spring上下文,该方式同样可以实现步骤4,但比4更好,以为ApplicationContext是BeanFactory的子接口,有更多的实现方法
6. 如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessBeforeInitialization(Object obj, String s)方法,BeanPostProcessor经常被用作是Bean内容的更改,并且由于这个是在Bean初始化结束时调用After方法,也可用于内存或缓存技术
7. 如果这个Bean在Spring配置文件中配置了init-method属性会自动调用其配置的初始化方法
8. 如果这个Bean关联了BeanPostProcessor接口,将会调用postAfterInitialization(Object obj, String s)方法
注意:以上工作完成以后就可以用这个Bean了,那这个Bean是一个single的,所以一般情况下我们调用同一个ID的Bean会是在内容地址相同的实例
9. 当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean接口,会调用其实现的destroy方法
10. 最后,如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法
8.IoC的好处
- 对象创建统一管理
- 规范的对象生命周期管理
- 获取一致的对象(单例模式)
灵活的依赖注入