spring框架ioc(控制反转)第三讲
spring管理struts2的action:
前面介绍了spring对dao层和service层的管理,下面来说一下对action层的管理
在action中从spring容器获取bean实例。
由于action由struts2框架进行实例化,所以无法实现依赖注入(将service注入到action的属性中)。
解决:
让spring对action进行实例化,完成action的依赖的注入。
注意:spring对bean进行实例化是前提,才可以对bean进行依赖注入。
在这之前要先了解一下bean的作用域,spring提供了一下几种作用域:
重点:
1、singleton:单例,系统在运行中只有一个实例
在加载spring容器时候将bean实例化好了,只实例化一次。
spring容器对bean的管理默认就是单例。
2、prototype:多例,每次访问都要创建一个实例。
调用applicationContext.getBean方法时,都会创建一个实例。
所以在这里只有action层是多例,其它层都是单例,因为action层除了依赖service层之外还有其他的数据域的成员变量,级当类线程安全时可以用单例,没有数据域的成员变量(具有状态的属性)
spring和web系统整合
applicationContext是spring的容器实例对象,对它的管理采取单例。
spring提供方案对applicationContext容器实例对象进行单例管理:
将applicationContext和servletContext(单例)绑定。
采用方法:在web.xml中添加监听器,当系统启动时候加载spring容器,创建spring容器的实例applicationContext,将applicationContext和servletContext(单例)绑定。
需要加入spring对web层的整合包spring-web-4.2.4.RELEASE.jar
<!-- 监听器,加载spring的配置文件,创建spring容器实例,和servletContext进行绑定 -->
<!-- 加载spring容器,与servletContext绑定 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 如果不指定contextConfigLocation,默认加载/WEB-INF/applicationContext.xml -->
<context-param>
<param-name>contextConfigLocation</param-name>
<!-- spring配置文件 可以采用加载多个文件,中间以半角逗号分隔,也可以使用通配符号 -->
<param-value>classpath:spring/applicationContext.xml</param-value>
</context-param>
spring和struts2整合
第一步:将action在spring容器配置
第二步:在struts.xml配置bean的name或id
总结:基于spring的完整开发
dao
service
在spring容器中配置service,配置service依赖的属性:
action
在spring容器配置action:
在struts.xml配置action
以上就是完整的使用spring进行开发客户管理系统,测试后并没有什么问题。
基于注解方式进行IOC开发
除了上述开发方式外,spring还给我们提供了更简单的注解开发:
使用注解,spring通过注解方式完成bean的管理。
bean的管理包括两部分:
1、对 bean实例化
2、对bean依赖注入
准备环境:
将applicationContext.xml文件置空
加入spring-aop-4.2.4.RELEASE.jar
在spring中提供了@component标识就是一个bean。
@Component可以用在任何的bean上。
配置context:component-scan组件扫描:
引入context命名空间
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 配置组件扫描
component-scan可以扫描注解:@controller、@Service、@Repository、@Component
指定扫描的包cn.itcast.crm,可以扫描子包下的类
-->
<context:component-scan base-package="cn.itcast.crm"></context:component-scan>
</beans>
原理:
在加载spring容器时,根据上边配置的包路径,扫描包下的及子包下的类,如果标识了:@controller、@Service、@Repository、@Component进行实例化。
依赖注入的注解:
@Autowired:
按类型注入
1、可以标识在属性上,根据属性类型去spring容器中找同类型的bean,找到则将bean注入到属性中。
@Autowired//按类型注入
private CustomerDao customerDao;
注意:如果容器中同一个类型的bean如果有多个,使用Autowried报错,找到多个同类型的bean,使用@Qualifier和Autowired配置配置,Qualifier指定将哪个bean注入进来。
可以用在set方法上。
找set方法中参数类型,根据参数类型从容器中找bean,注入。
@Resource:
按名称注入
和autoWired区别:Resource注解是jdk下的,而autoWired是spring提供。