spring框架ioc(控制反转)第三讲

 spring管理struts2action:

前面介绍了spring对dao层和service层的管理,下面来说一下对action层的管理

 

action中从spring容器获取bean实例。

 

由于actionstruts2框架进行实例化,所以无法实现依赖注入(将service注入到action的属性中)。

 

解决:

 

springaction进行实例化,完成action的依赖的注入。

 

 

 

注意:springbean进行实例化是前提,才可以对bean进行依赖注入。

在这之前要先了解一下bean的作用域,spring提供了一下几种作用域:

重点

1singleton:单例,系统在运行中只有一个实例

在加载spring容器时候将bean实例化好了,只实例化一次。

spring容器对bean的管理默认就是单例。

 

2prototype:多例,每次访问都要创建一个实例。

调用applicationContext.getBean方法时,都会创建一个实例。

所以在这里只有action层是多例,其它层都是单例,因为action层除了依赖service层之外还有其他的数据域的成员变量,级当类线程安全时可以用单例,没有数据域的成员变量(具有状态的属性)

 

 springweb系统整合

 

applicationContextspring的容器实例对象,对它的管理采取单例。

 

 

 

spring提供方案对applicationContext容器实例对象进行单例管理:

 

 

 

applicationContextservletContext(单例)绑定。

 

 

 

采用方法:在web.xml添加监听器,当系统启动时候加载spring容器,创建spring容器的实例applicationContext,将applicationContextservletContext(单例)绑定。

 

 

 

需要加入springweb层的整合包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>

 

springstruts2整合

 

第一步:将actionspring容器配置

第二步:在struts.xml配置beannameid

 

 

总结:基于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,使用@QualifierAutowired配置配置,Qualifier指定将哪个bean注入进来。

 

 

可以用在set方法上。

set方法中参数类型,根据参数类型从容器中找bean,注入。

 

 

@Resource

按名称注入

 

autoWired区别:Resource注解是jdk下的,而autoWiredspring提供。

 

posted @ 2019-01-08 20:58  坑神欲哭无泪  阅读(245)  评论(0编辑  收藏  举报