Spring是一个轻量级的DI(IoC)和AOP容器框架。存在的目的是用于构建轻量级的J2EE应用。
1.轻量级:应用大小和应用开支,包括应用方式
2.DI(IoC):提供松耦合的一种实现技术
3.AOP:切面编程将业务逻辑从应用服务中分离
4.容器:包含并管理应用对象的生命周期和配置
5.框架:使用组件配置组合成复杂的应用,并提供很多基础功能
项目中引入spring立即可以带来下面的好处
1.降低组件之间的耦合度,实现软件各层之间的解耦。
2.可以使用容器提供的众多服务,如:事务管理服务、消息服务等等。当我们使用容器管理事务时,开
发人员就不再需要手工控制事务.也不需处理复杂的事务传播。
3.容器提供单例模式支持,开发人员不再需要自己编写实现代码。
4.容器提供了AOP技术,利用它很容易实现如权限拦截、运行期监控等功能。
5.容器提供的众多辅作类,使用这些类能够加快应用的开发,如:JdbcT emplate、HibernateT emplate。
6.Spring对于主流的应用框架提供了集成支持,如:集成Hibernate、JPA、Struts等,这样更便于应用的
开发。
第一个Spring应用
(1):搭建环境,在spring最基础的应用中只需要dest\spring.jar和lib\jakarta-commons\commons-logging.jar
新建spring的配置文件,文件名称可以任意,位置也可以任意,但考虑到通用性,一般将配置文件存放在类路径下,配置文件的模板可以在spring 参考手册中获取(查中输入<bean>),模板大致如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="/schema/beans"
xmlns:xsi="/2001/XMLSchema-instance"
xsi:schemaLocation="/schema/beans
/schema/beans/spring-beans-2.5.xsd">
</beans>
(2):实例化spring容器,通过在类路径下寻配置文件(配置文件可以有多个,以字符数组的形式传入)
/* 当存在多个配置文件时,可以将spring配置文件名,字符串数组的形式传入 */ ApplicationContext ac = new ClassPathXmlApplicationContext(
"l");
(3):将实体bean的创建与维护交由spring管理
在配置文件中的<beans>下使用<bean>标签
<!—指定实体bean的名称,当名称含有特殊字符时,需要用name指定,一般情况下使用id,id 在配置文件中唯一,而name可以重复指定,获取时,获取到最后一个,在name中可以使用逗号将多个名称
隔开,来达到指定bean的多个名称,当id和那么都没有指定时,则以类的全名作为name,如果存在多个name和id没有指定且实例类都是一样的bean,可以使用clazzpath/#来获取,#代表在xml中存在的序号-->
<!—calss指定需要被管理的实体bean,需要是完整的类名-->
<bean id="personService"
class="kay.spring.services.impl.PersonServiceImpl"/> (4):调用实体bean
使用实例化的spring容器的getBean(beanNa me)获取实体bean
实例化bean的三种方式
(1):使用默认的构造函数进行实例化bean
<bean id=”xxx” class=”Xxx”/>
(2):使用静态工厂方法创建bean
<bean id=”xxx” class=”Xxx” factory-method=”xxxx”/>
(3):使用实例化工厂方法创建bean
1,先实例化工厂<bean id=”factory” class=”Xxx”/>
2,然后实例化bean <bean id=”xxx” class=”Xxx” factory-method=”xxxx”/>
默认情况下会在容器启动时初始化bean,但我们可以指定Bean节点的lazy-init=“true”来延迟初始化bean,这时候,只有第一次获取bean会才初始化bean。如:
<bean id="xxx" class="cn.itcast.OrderServiceBean" lazy-init="true"/>
如果想对所有bean都应用延迟初始化,可以在根节点beans设置default-lazy-init=“true“,如下:
<beans default-lazy-init="true“ ...>
Bean的作用域(bean的scope属性指定)
1.singleton:定义bean的范围为每个Spring容器一个实例(默认值)
2.prototype:定义bean可以被多次实例化(使用一次就创建一次)
4.session:定义bean的范围是HTTP会话,只有再使用有web能力的spring上下文时有效。
5.global-session:定义bean的范围是全局HTTP会话,只有再portlet上下文中有效。
指定Bean的初始化方法和销毁方法
Spring初始化bean或销毁bean时,有时需要作一些处理工作,因此spring可以在创建和拆卸bean的时候调用bean的两个生命周期方法<bean init-method=”初始化方法名称”destroy-mrthod=”销毁方法名称”>,而destory-method属性在bean的作用域范围为Singseton时有效。
依赖注入
(1):基于xml配置的依赖注入。
IPersonDao类
kay.spring.dao;
public interface IPersonDao {
public void save();
}
PersonDaoImpl类
kay.spring.dao.impl;
kay.spring.dao.IPersonDao;
public class PersonDaoImpl implements IPersonDao {
public void save() { System.out.println("调用dao的save()...");}
}
IPersonService类
kay.spring.services.impl;
public interface IPersonService {
public void save();
}
在PersonServiceImpl类中注入IPersonDao的实现类的实例对象
(a):使用属性的setter()注入(为需要被注入的对象添加setter())
private IPersonDao dao;
public void setDao(IPersonDao dao) {
this.dao = dao;
}
Xml配置为:
<bean id="personDao"class="kay.spring.dao.impl.PersonDaoImpl"/> <bean id="personService"
class="kay.spring.services.impl.PersonServiceImpl">
<property name="dao"ref="personDao"/>
</bean>
(b):使用构造器注入(为需要被注入的对象添加构造方法)
private IPersonDao dao;
public PersonServiceImpl(IPersonDao dao) {
this.dao = dao;
}
Xml配置为:
<bean id="personDao"class="kay.spring.dao.impl.PersonDaoImpl"/> <bean id="personService"
resource和autowired注解的区别
class="kay.spring.services.impl.PersonServiceImpl">
<constructor-arg type="kay.spring.dao.IPersonDao"
ref="personDao"/>
</bean>
依赖注入可以注入从基本类型到集合类型以及应用系统的bean
setter方法方式的注入依赖
(1)注入基本类型:<property name=”被注入的属性名称” value=”10”/>
(2):注入应用系统的bean:
(a):引用外部:<property name=”被注入的属性名称” ref=”被引用的bean”/>
(b):引用内部(缺点是在外面不能引用内部bean,当仅在该类使用时,可以使用此方式):
<property name=”被注入的属性名称”>
<bean class=”被引用bean的完整类名”/>
</property>
(3):注入集合类型:
(a):注入set类型的集合(使用property的子元素set注入)((list,数组)与set注入一样,需要使用list标签进行注入)
<property name=”被注入的属性名称”>
<set>
<value>注入的值为基本类型</value>
<bean class=”被引用bean的完整类名,注入的值为内部bean”/>
<ref bean=”被引用的外部bean”,注入的值为外部bean/>
</set>
<property/>
Set的子元素很多,可以注入所有类型,还包括,Set,list,map,props,null等。
(b):注入properties类型集合,使用property的子标签props标签注入
<property name=”被注入的属性名称”>
<props>
<prop key=”键”>值</prop>
<props/>
<property/>
(3):注入Map类型的集合, 使用property的子标签map标签注入,map标签下使用entry标签设置key对应的值。
<property name=”被注入的属性名称”>
<map>
<entry key=”键”>
<value>值</value>
<ref bean=”引用的bean”/>
<list>….<list>
……
<entry>
</map>
</property>
(4):注入null类型的值
<property name=”被注入的属性名称”>
<null/>
</property>
构造函数方式注入依赖
使用bean标签下的<constructor-arg>子标签,构造方法中的每一个参数,用一个<construstor-arg>
Exp:bean的构造函数为:
public PersonServiceImpl(IPersonDao dao,String name){
this.dao = dao;
this.name = name;
}
配置为:
<construstor-arg index=”0” ty pe=”kay.dao.IPersonDao”>
<ref bean=”xxxxx”/>
</consturstor>
<construstor-arg index=”0” ty pe=”java.lang.String”>
<value>mrkay</value>
</consturstor>
备注:传入其他类型的参数使用construstor-arg的子标签,index:代表参数位置的索引,type指定参数类型(基本类型的参数,type可以省略)。
(2):基于annotation方式的依赖注入。
在java代码中使用@Autowired或@Resource注解方式进行装配的前提条件是:
(1):在spring的配置文件中引入context的命名空间(标红的字体)
<beans xmlns="/schema/beans"
xmlns:xsi="/2001/XMLSchema-instance"
xmlns:context="/schema/context"
xsi:schemaLocation="/schema/beans
/schema/beans/spring-beans-2.5.xsd /schema/context
/schema/context/spring-context-2.5.xsd"> ……………
</beans>
备注:在spring的开发文档中使用context:annotation-config进行查。
(2):在bean标签中加入:<context:annotation-config/>
这个配置隐式注册了多个对注释进行解析处理的处理器
AutowiredAnnotationBeanPostProcessor,
CommonAnnotationBeanPostProcessor,
PersistenceAnnotationBeanPostProcessor,
RequiredAnnotationBeanPostProcessor
使用注解还需要导入commons-annotation.jar(在spring安装包的j2ee/commons-annotation.jar)
在java代码中使用@Autowired或@Resource注解方式进行装配,这两个注解的区别是:@Autowired 默认按类型装配,@Resource默认按名称装配,当不到与名称匹配的bean才会按类型装配,当明确指定了bean 的名称时,只会按名称查。
注解可以作用在需要被注入的字段上或者字段的setter属性上。
Exp:
使用@Resource
@Resource
private IPersonDao dao;
/*首先根据字段dao的名称在配置文件中去id或者name为dao的bean,如果不到就根据类型在配置文件中查相应的bean,也可以明确指定需要注入的bean:@Resource(name=”dao”),允许
被注入的值为null*/
作用在setter属性上,与字段上使用方式一致
@Resource
public void setDao(IPersonDao dao) {
this.dao = dao;
}
或者使用@Autowired
@Autowired
private IPersonDao dao;
/*首先根据字段dao的名称在配置文件中去id或者name为dao的bean,如果不到就抛错,也可以明确指定需要注入的bean(结合@Qualifier使用):@Autowired@Qualifier(”dao”),默认情

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。