Spring学习IoC控制反转(一)

来源:互联网 发布:模型和算法的区别 编辑:程序博客网 时间:2024/06/04 19:08

本节的重点内容:

1,通过ClassPathXmlApplicationContext 和 FileSystemXmlApplicationContext 读取spring 配置文件 

2,BeanFactory 和 ApplicationContext 区别 

3,理解IoC 和 DI 概念

4,Bean三种实例化方式 (无参数构造器 重要)

5,Bean范围 singleton 和 prototype 

6,依赖注入属性 构造器属性注入、setter属性注入   (setter是重点)

7,引入多个XML配置文件

8,spring注解使用 @Autowired @Resouse @Controller @Service @Repository 


一,

学习三大框架 Java体系结构分为三层,将服务器程序分为三层(web层,业务层,持久层)

其中 struts2 web层,hibernate 持久层,speing业务层

spring的出现是为了取代EJB的臃肿,而且spring提供web层,业务层 ,持久层各层的技术!

二,

使用spring的好处:

1,所有对象的创建和维护都交给spring管理,spring就相当于一个大工厂,实现于程序的解耦;

2,AOP面向切面编程,底层使用的代理模式;

3,spring的声明式事务处理;

4,spring完美与junit4整合;

5,提供大量的模板和工具类;

三:

使用spring创建web工程的步骤:

导入jar : 每个spring工程都必须使用核心包 四个
(1),spring-expression-3.2.0.RELEASE.jar

(2)spring-core-3.2.0.RELEASE.jar

(3)spring-context-3.2.0.RELEASE.jar

(4)spring-beans-3.2.0.RELEASE.jar

Spring框架运行 必须依赖 apache 提供 commons-loggings 
整合log4j 直接导入log4j   在src下创建log4j.properties

四:

使用spring最强大的功能有两个

 1,IoC 控制反转,把创建和实例化bean的权力交给spring管理,其中实例化类中的构造依赖属性可以通过配置注入(DI依赖注入)

2,AOP  面向切面编程


五:

1,spring的配置文件可以放到src下,也可以放到WebRoot下,一般都叫application.xml ,但也不固定

因为spring完美和junit4结合,所以你可以很轻易在编程中间测试你的配置和编写是否正确

2,(1)加载src下的spring配置文件方式

@Test

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
/
/获得交给spring管理的类,此方法就相当于 Xxx xxx = new Xxx();但是通过spring获得的是Xxx的代理对象

applicationContext.getBean("Xxx");

(2)记载WebRoot下的spring配置文件方式

@Test

ApplicationContext applicationContext =new FileSystemXmlApplicationContext("applicationContext.xml");

3,ApplicationContext是BeanFactory的子接口并且对BeanFactory 做了一些扩展,建议用ApplicationContext

六:


1, Bean装配 (Xml配置方式)Bean有三种实例化方式(第一种最常用)

(1),<bean id="" class="" />  采用反射调用bean的无参数构造方法实例化对象  Class.forName("bean").newInstance() ; 

(2),<bean id="" class="工厂" factory-method="方法"/> 由工厂static方法 提供Bean实例 

<!-- 第二种  静态工厂方法 --> <bean id="bean2" class="cn.itcast.factory.MyBeanFactory" factory-method="createBean2"></bean>
// 提供Bean2 实例  --- 静态方法public static Bean2 createBean2(){return new Bean2();}

(3)

<!-- 第三种 实例工厂方法 --> <!-- 实例化工厂 -->

             <bean id="factory" class="工厂" /> 工厂会通过无参数构造器实例化 
    <bean id="" factory-bean="factory" factory-method="方法" /> 通过工厂实例方法 创建Bean实例 

   <!-- 第三种 实例工厂方法 -->   <!-- 实例化工厂 -->   <bean id="mybeanFactory" class="cn.itcast.factory.MyBeanFactory"></bean>   <bean id="bean3" factory-bean="mybeanFactory" factory-method="createBean3"></bean>

// 提供Bean3 实例 --- 实例方法,工厂需要实例化public Bean3 createBean3(){return new Bean3();}
2,Bean作用域 配置 <bean scope="" > 

singleton 单例 ---- 整个容器中只有一个实例
prototype 多例 ---- 每次调用Bean 创建一个新的实例 

** 单例 在 new ApplicationContext 时构造,多例 在getBean时 构造

3,(DI)依赖注入bean属性的方式

(1),构造器注入

<bean>
   <constructor-arg> 完成构造器参数注入
* 推荐使用构造参数下标索引 完成注入  <constructor-arg index="0" value="宝马"></constructor-arg>
* 如果存在 多个构造器 参数个数相同的,结合类型完成注入  <constructor-arg index="0" type="java.lang.String" value="宝马"></constructor-arg>

(2),setter方式注入(重点)

<bean>
    <property> 完成属性setter注入
*<property name="" value="" /> 注入普通值属性 
* <property name="" ref="" /> 注入另一个Bean 

将一个Bean注入给另一个Bean 意义?  Action 中使用Service,将Service注入到Action , Service中使用DAO ,将DAO注入Service


4,Spring容器中,配置Bean之间的关系

1) 父子Bean : 当需要在Spring容器中 多次使用同一个Bean数据,依赖注入数据不同,引用父子Bean ,将公共属性放入父Bean,在子Bean中留下个体属性 

// 父bean
<bean id="cat" class="cn.itcast.domain.Cat" abstract="true">
    <property name="address" value="北京"/> 
</bean>
// 子bean
<bean id="cat1" parent="cat" >
    <property name="name" value="黑猫警长" />
</bean>
<bean id="cat2" parent="cat" >
    <property name="name" value="白鸽探员" />
</bean>

2) 依赖Bean: 一个Bean实例化之前,必须先将另一个Bean 实例化接收 (依赖另一Bean实例化一些数据)
<bean id="a" class="....A" />
B实例化前,必须先将 A实例化
<bean id="b" class="....B" depends-on="a"/>

七:

使用多个XML配置spring框架的配置文件

方式一:将配置分解为多个配置文件 
new ClassPathXmlApplicationContext("applicationContext.xml","applicationContext2.xml");

方式二: 将配置分解为多个配置文件 applicationContext.xml  applicationContext2.xml  (推荐)
在一个文件中通过 <import> 引入其他配置文件

<import resource="classpath:applicationContext2.xml"/>
new ClassPathXmlApplicationContext("applicationContext.xml"); // 自动引入另一个配置文件 

八:

使用注解方式装配Bean

(1),要想使用注解,首先需要在application.xml中配置一些支持注解的东东

** 采用注解配置bean 需要使用 beans context 名称空间
 

<!-- 使用Spring注解配置 -->       <context:annotation-config></context:annotation-config>       <!-- 通知Spring框架,应用注解类在哪个包 -->       <context:component-scan base-package="cn.zfx.beans"></context:component-scan>
2),@Repository  用于DAO
      @Service   用于Service
      @Controller   用于控制器

(3),自动装配Bean (Bean属性的依赖注入) @Autowired     //@Resource 功能和 @Autowired 一样     

@Autowired    //@Autowired 有 required属性,默认值true, 必须完成装配,否则 异常
private UserDAO userDAO; // 连setter方法都不需要 ,就可以完成注入
(4),篇日志Bean的范围

@Scope(value="prototype") 多例,每次getBean 创建新的实例
@Scope(value="singleton") 单例,容器只会实例化对象一次 

九:

在web中使用spring

(1),1、需要导入额外jar包 : spring-web-3.2.0.RELEASE.jar 
    ContextLoaderListener 监听器默认 WEB-INF/applicationContext.xml 

<listener>  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener> Spring框架核心配置文件位置<context-param>  <param-name>contextConfigLocation</param-name>  <!-- 指定配置文件位置 --><!--   <param-value>/WEB-INF/applicationContext2.xml</param-value> -->  <param-value>classpath:applicationContext1.xml</param-value></context-param>
(2),在程序中获得WebApplicationContext对象

WebApplicationContext applicationContext = WebApplicationContextUtils.getWebApplicationContext(this.getServletContext());

0 0
原创粉丝点击