Spring之IOC&DI/装配Bean(一)

简介

今天学习Spring的第一天,无非也就是入门基础知识。主要了解IOC和DI部分,要熟练掌握哦~

Spring简介

1. Spring介绍
	Spring是一个非常活跃的开源框架;它是一个基于Core来构架多层JavaEE系统的框架,它的主要目地是简化企业开发.
	Spring以一种非侵入式的方式来管理你的代码,Spring提倡”最少侵入”,这也就意味着你可以适当的时候安装或卸载Spring 

2. Spring框架的优势
	?方便解耦,简化开发
	?Spring就是一个大工厂,可以将所有对象创建和依赖关系维护,交给Spring管理
	?AOP编程的支持
	?Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能
	?声明式事务的支持
	?只需要通过配置就可以完成对事务的管理,而无需手动编程
	?方便程序的测试
	?Spring对Junit4支持,可以通过注解方便的测试Spring程序
	?方便集成各种优秀框架
	?Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、Hibernate、MyBatis、Quartz等)的直接支持
	?降低JavaEE API的使用难度
	?Spring 对JavaEE开发中非常难用的一些API(JDBC、JavaMail、远程调用等),都提供了封装,使这些API应用难度大大降低

3. Spring模块介绍
	Spring 框架是一个分层架构,,它包含一系列的功能要素并被分为大约20个模块。这些模块分为Core Container、Data Access/Integration、Web、AOP(Aspect Oriented Programming)、Instrumentation和测试部分


Spring开发准备

1. 准备Jar包
	dist\spring.jar	--spring的核心类库 在spring文档的dist下 
	lib\jakarta-commons\commons-logging.jar	--引入的第三方类库 都spring文档的lib下
	lib/aspectj/aspectjweaver.jar和aspectjrt.jar	--如果使用了切面编程(AOP),还需要下列jar文件 
	lib/cglib/cglib-nodep-2.1_3.jar
	如果使用了JSR-250中的注解,如@Resource/@PostConstruct/@PreDestroy,还需要下列jar文件 
	lib\j2ee\common-annotations.jar
2. Spring配置文件
	默认情况下是applicationContext.xml
	在beans.xml中引入约束的文件
	<beans xmlns="http://www.springframework.org/schema/beans"
		   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		   xsi:schemaLocation="http://www.springframework.org/schema/beans
							   http://www.springframework.org/schema/beans/spring-beans.xsd">
	</bean>
	beans.xml中不能显示对应的提示:此时xsd的文件没有被加载到myeclipse中.在beans包spring-beans-3.0xsd
	ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");

 

Spring基本功能详解

1. 控制反转(IOC)
    Spring的控制反转:把对象的创建、初始化、销毁等工作交给spring容器来做。由spring容器控制对象的生命周期
    获取IOC容器的对象
        1). 启动spring容器
            在类路径下寻找配置文件来实例化容器 
                ApplicationContext ctx = new ClassPathXmlApplicationContext("");
        2). 从spring容器中提取对象
            ctx.getBeans("userService");
2. Spring配置别名
    <bean name="person" class="cn.itcast.aliasspring.Person"/>
    <alias name="person" alias="p"/>
3. 模拟spring底层:IOC和DI原理
    * IOC(控制反转)是利用java的反射思想实现的
    * DI(依赖注入)是利用java的内省机制实现
4. spring容器中bean节点id和name的区别
    区别1: 
        id指定唯一实例引用
        name可以指定多个实例引用
    区别2:
        id: 命名规范要满足xml对id属性命名规范
        name: 如果bean的名称含有特殊字符,就需要使用name属性
    备注:如果spring当前版本是3.0时候,id是有命名规范区别,
    如果当前版本是3.2可以 通用
    id和name不能出现重名
5. 加载spring容器的3种方式
    方式1:
        在类路径下寻找配置文件实例化容器
        ClassPathXmlApplicationContext
        可以一次性加载多个配置文件
    方式2:
        在文件系统下寻找配置文件
        FileSystemXmlApplicationContext
    方式3:
        BeanFactory ac = new XmlBeanFactory(new FileSystemResource("D:\\beans.xml"));
    ApplicationContext是对BeanFactory扩展,提供了更多功能
        国际化处理
        事件传递
        Bean自动装配
        各种不同应用层的Context实现

装配Bean

1. 三种实例化bean的方式
	1). 使用接口和类,直接在spring容器中创建一个类,使用接口进行操作
		<bean id="userService" class="cn.itcast.c_class.UserServiceImpl"></bean>
	2). 使用静态工厂方法实例化(简单工厂模式)
		<bean id="userObject" class="cn.itcast.d_staticMethod.UserObject" factory-method="createUser">
	3). 使用实例工厂方法实例化(工厂方法模式)
		<bean id="userObject" class="cn.itcast.e_method.UserObject"></bean>
		<bean id="user" factory-bean="userObject" factory-method="createUser"></bean>
		
2. bean 的作用域
	在spring容器中存在scope的属性
	1). singleton(单例:默认值) 表示创建UserServiceImpl对象,容器只创建一次
		* lazy-init属性(只针对单例有效)
	2). prototype (多例)
		表示每次加载ac.getBean("userService");都会执行UserServiceImpl的构造方法,容器此时可以创建多个对象。	注意:用途:如果通过spring创建struts的Action实例的时候,就必须指定prototype类型,因为struts2是多实例多线程,否则struts2的值栈会出现问题
	3). Request
		在依次Http请求中,一个bean定义对应一个实例,该作用域在Spring ApplicationContext情形下有效
	4). Session
		在意一个HttpSession中,一个bean定义对应一个实例
	5). Global session
3. 初始化bean时机
	Spring默认在启动时将所有singletonbean提前进行实例化。提前实例化意味着作为初始化的一部分,ApplicationContext会自动创建并配置所有的singleton bean.通常情况下这是件好事。因为这样在配置中有任何错误能立即发现。
		Lazy-init=”true or  false”
		Lazy-init 为false,spring容器将在启动的时候报错(比较好的一种方式)
		Lazy-init 为true,spring容器将在调用该类的时候出错
4. init、destroy
	Spring初始化bean或销毁bean时,有时需要作一些处理工作,因此spring可以在创建和拆卸bean的时候调用bean的两个生命周期方法
	  <bean id=“foo” class=“...Foo”
            init-method=“setup”
            destory-method=“teardown”/>
5. 创建bean的生命周期			
	**1.instantiate bean对象实例化
	2.populate properties 封装属性
	3.如果Bean实现BeanNameAware 执行 setBeanName
	4.如果Bean实现BeanFactoryAware 或者 ApplicationContextAware 设置工厂 setBeanFactory 或者上下文对象 setApplicationContext
	5.如果存在类实现 BeanPostProcessor(后处理Bean) ,执行如果Bean实现InitializingBean 执行 afterPropertiesSet 
	接口 BeanPostProcessor 后处理Bean 提供两个钩子函数,用于开发者 动态去修改Bean对象  (动态代理)
	6.如果bean实现InitializingBean,执行afterPropertiesSet()初始化
	7.调用<bean init-method=“userInitMethod"> 指定初始化方法 userInitMethod
	8.如果存在类实现 BeanPostProcessor(处理Bean) ,执行postProcessAfterInitialization
	**9.执行业务处理,即用户自定义的业务操作
	10.如果Bean实现 DisposableBean 执行 destroy(适用单例)
	11.调用<bean destroy-method=“userDestroyMethod"> 指定销毁方法 userDestroyMethod(适用单例)

 

依赖注入(DI)

1. 依赖注入(DI)
	所谓依赖注入就是指:在运行期,由外部容器动态地将依赖对象注入到另一个对象的组件中
	<bean id="boy" class="cn.itcast.b_di.Boy"></bean>
	<bean id="girl" class="cn.itcast.b_di.Girl">
		<!-- 
			将spring容器中创建的boy对象传递给Girl对象中的set方法
		    * name:在Girl对象中的set方法的属性名称
		    * ref:将容器创建的对象注入到set方法中
		 -->
		<property name="boy" ref="boy"></property>
	</bean>
2. 依赖注入(DI)
	1).  通过setter方法注入依赖
		<bean>元素的<property>子元素指明了使用它们的set方法来注入。可以注入任何东西,从基本类型到集合类,甚至是应用系统的bean
		a. 使用p命名空间
			为了简化XML文件配置,Spring从2.5开始引入一个新的p名称空间
			p:<属性名>="xxx" 引入常量值
			p:<属性名>_ref="xxx" 引用其它Bean对象
		b. 装配各种类型实现
			List: <property name="lists"><list>
			数组: <property name="obj"><list>
			Set: <property name="sets"><set>
			Map: <property name="maps"><map><entry key=""><value>	--需要注意的是key值必须是String
			Properties: <property name="props"><props>
			List(null): <property name="listnull"><null/>
	2). 通过构造器函数
		a. 通过参数
			<constructor-arg index="0">
				  <value>张三</value>
			</constructor-arg>
		b. 通过参数的类型
			<constructor-arg type="java.lang.Integer">
				   <value>56</value>
			</constructor-arg>
		c. 两者结合一起使用
			<constructor-arg type="java.lang.Integer" index="0">
				   <value>56</value>
			</constructor-arg>
	3). bean之间继承关系
		<bean id="person" class="" abstract="true"></bean>
		<bean id="student" parent="person">
			<property name="name" value="tom"></property>
		</bean>
	4). 依赖
		依赖,一个类内部运行依赖另一个Bean初始化一些数据
	5). 配置多个XML文件(spring容器)
		方式一 可以在创建ApplicationContext对象时传入多个配置文件
			ApplicationContext applicationContext = new 
			ClassPathXmlApplicationContext("beans1.xml", "beans2.xml");
		方式二 (一般采用)可以在配置文件中通过<import>引入其他配置文件
			<import resource="classpath:bean2.xml"/>
	6). 注解配置:使用@autowired和@Qualifier
		a. 引入context命名空间
			 xmlns:context="http://www.springframework.org/schema/context"
				   http://www.springframework.org/schema/context
				   http://www.springframework.org/schema/context/spring-context-3.0.xsd">
		b. 在配置文件中添加context:annotation-config标签
		c. 使用注解@autowired标注在属性上
			Autowired标注在字段上	  
			@Autowired注解默认按类型进行装配
				获取该注解标注的字段的类型---PersonDao类型
				以该类型为条件到spring容器(beans.xml)中去查找bean的id节点的类型是PersonDao类型.
				找到以后,获取该节点对应的对象,利用反射直接为personDao变量赋值 
			@Qualifier(“personDao”)该注解以名字为条件查找依赖对象
				以该注解的的参数personDao条件到spring容器(beans.xml)中去查找bean的id节点的值是personDao的对象
				找到以后,获取该节点对应的对象, 利用反射直接为personDao变量赋值,如果不存在该名称,抛出异常
		d. 使用注解@autowired标注在set方法上
			Autowired标注在setter方法上	  
				 @Autowired注解默认按类型进行装配
				  *  获取 setPersonDao()方法的参数的类型---PersonDao类型
				  *  以该类型为条件到spring容器(beans.xml)中去查找bean的id节点的类型是PersonDao类型.
				  * 找到以后,获取该节点对应的对象, 把该对象作为实参传递给该setPersonDao(
			PersonDao personDao)的形参.
			@Qualifier("personDao")该注解以名字为条件查找依赖对象
				  *  以该注解的的参数personDao条件到spring容器(beans.xml)中去查找bean的id节点的值是PersonDao的对象
				  *  找到以后,获取该节点对应的对象, 把该对象作为实参传递给该setPersonDao(
			PersonDao personDao)的形参.
				  * 如果不存在该名称,抛出异常
		7). 使用@Resource
			esource注解标注在字段上	  
			* @Resource注解默认按名称装配。
			* 如果没有指定name属性
				 *  获取该注解标注的字段值---personDao
				 *  以该字段值为条件到spring容器(beans.xml)中去查找bean的id节点的值是 personDao的节点
				 * 找到以后,获取该节点对应的对象, 利用反射直接为personDao变量赋值
				 * 如果没有找到.并且按照默认的名称找不到依赖对象时, @Resource注解会回退到按类型装配
				 * 获取该注解标注的字段类型--PersonDao
				 * 以该类型为条件到spring容器(beans.xml)中去查找bean的节点的类型是PersonDao类型的对象
				 * 找到以后,获取该节点对应的对象,利用反射直接为personDao变量赋值
		   * 如果指定name属性,只能按名称装配
				 *  获取name属性的值 personDao
				 *  以该值为条件到spring容器(beans.xml)中去查找bean的id节点的值是PersonDao的对象
				 * 找到以后,获取该节点对应的对象, 利用反射直接为personDao变量赋值
				 * 如果不存在该名称,抛出异常
		8). 使用classpath自动扫描把组件纳入spring容器中管理
			作用:在开发时对项目的每一层进行划分
			Spring3.0为我们引入了组件自动扫描机制,它可以在类路径底下寻找标注了@Component、@Service、@Controller、@Repository注解的类,并把这些类纳入进spring容器中管理
			a. 引入context命名空间
			b. 在配置文件中添加
				<context:component-scan base-package="cn.itcast"/>

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。