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)
<!-- 配置WEB整合的监听器 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 加载方式:默认只能加载WEB-INF目录下的配置文件,提供配置方式,加载src目录下 src目录编译后到WEB-INF/classes目录下--> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param>
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的好处
- 对象创建统一管理
- 规范的对象生命周期管理
- 获取一致的对象(单例模式)
灵活的依赖注入