一、理论知识
1.依赖注入、控制反转
依赖注入:在运行期,由外部容器动态地将依赖对象注入到组件中
控制反转:应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部窗口负
责得。这样控制权就由应用转移到了外部容器,控制权的转移就是所谓的反转。
2.spring 的主要特性。
1)降低组件之间的耦合度,实现软件各层之间的解耦。
2)可以使用容器提供的众多服务,如:事务管理服务、消息服务、JMS 服务、持久化服
务等等。
3)容器提供单例模式支持,开发人员不再需要自己编写实现代码。
4)容器提供了AOP 技术,利用它很容易实现如权限拦截,运行期监控等功能。
5)容器提供的众多辅作类,使用这些类能够加快应用的开发,如:JdbcTemplate
HibernateTemplate.
6)对主流的应用框架提供了集成支持。
3.常用技术
控制反转/依赖注入---面向切入编程---与主流框架的整合、管理---
二、基本实例
1.准备搭建环境
dist\spring.jar
lib\jakata-commons\commons-loggin.jar
如果使用了切面编程,还需下列jar 文件:
lib\aspectj\aspectjweaver.jar aspectjrt.jar
lib\cglib\cglib-nodep-2.1.3.jar
如果使用了jsr-250 中的注解,还需要下列jar 文件:
lib\j2ee\common-annotations.jar
2.搭建并测试环境
建立名为spring_01_base项目,根据需求导入jar包。建立一个Junit测试单元
SpringEnvTest,测试代码如下:
@Test
public void testEnv() {
ApplicationContext ctx = new
ClassPathXmlApplicationContext("l");
}
l 配置文件在此省略(见下)。运行此测试如无错,则说明环境搭建成功。
说明:l 可以在类路径下进行配置,也可以在具体的目录下配置。可以是一个配置文
件,也可以是多个配置文件组成String 数组传入。
3.实例
作如下准备工作:(1)建立UseDao接口,代码如下:
packagecom.asm.dao;
public interface UserDao {
voidsave();
}
2)建立UserDao接口的实现类,UserDaoImpl
packagecom.asm.dao.impl;
importcom.asm.dao.UserDao;
public class UserDaoImpl implements UserDao{
public void save() {
System.out.println("执行save方法...");
}
}
3)在src目录下配置此l,它的配置如下:
<?xmlversion="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">
<bean id="userDaoImpl" class="com.asm.dao.impl.UserDaoImpl" />
</beans>
说明:bean 代表一个实质的java 类,通过它的id 可以获取一个此类的一个对象。
补充:让xml 配置文件在编译时提示
[windows][preferences][myeclipse][files and editors][xml][xml catalog] add
在出现窗口的location 中选“file system,然后在spring 解压目录的dist/resources
目录中选择“spring-beans-2.5.xsd,并将key Type 值改为“Schema Location”,key
为:/schema/beans/spring-beans-2.5.xsd
4Junit 测试单元SpringEnvTest 中增加如下代码测试:
@Test
public void base() {
ApplicationContext ctx = new
ClassPathXmlApplicationContext("l");
UserDao userDao = (UserDao) Bean("userDaoImpl");
userDao.save();
}
以上的代码就是通过配置文件l 获取所需要的实例对象。
4.三种bean 的生成方式
除了上面使用的类直接生成方式,还有bean 静态工厂及bean 实例工厂。
bean 静态工厂的配置如下:
<bean id="userDaoImpl2" class="com.asm.dao.impl.UserDaoImplFactory"
factory-method="getUserDaoImpl"/>
相应的工厂类代码如下:
packagecom.asm.dao.impl;
public class UserDaoImplFactory {
public static UserDaoImpl getUserDaoImpl(){
return new UserDaoImpl();
}
}
bean实例工厂的配置如下:
<bean id="factory" class="com.asm.dao.impl.UserDaoImplFactory2"/>
<bean id="userDaoImpl3" factory-bean="factory"
factory-method="getUserDaoImpl"/>
相应的工厂类的代码如下:
packagecom.asm.dao.impl;
public class UserDaoImplFactory2 {
publicUserDaoImpl getUserDaoImpl() {
return new UserDaoImpl();
}
}
5.bean 的作用域
singleton:返回bean 的同一个实例,也是默认的作用域(无状态bean使用此作用域)
prototype:每次请求都会创建一个实例(有状态bean 使用此作用域)
requestsessionglobal session 这三个作用域主要用在web 应用中
6.bean 的生命周期
(1)什么时候初始化bean 实例
scopesingleton,即默认情况,会在装载配置文件时实例化。如果希望在调用getBean
时才初始化,可以使用lazy-init="true" 补充:如果希望希望该配置文件中的所有bean
都延迟初始化,则应在beans根结点中使用lazy-init="true"
scope=prototype ,在调用getBean()方法时才会初始化。
2)生命周期:
构造器、init 方法、获取bean 后的操作、destroy 方法(ctx.close、注意如果bean scope
设为prototype 时,当ctx.close 时,destroy 方法不会被调用)
7.属性注入Setter 方式
1)简单属性(如String):
<bean id="userServiceBean" class="com.asm.service.UserServiceBean">
<property name="id" value="10"></property>
<property name="username" value="张某某"></property>
</bean>
(2)对象属性-外部bean 注入:在上面的<bean>中增加如下配置:
<property name="userDao" ref="userDaoImpl"/>
对象属性-内部bean注入:在上面的<bean>中增加如下配置:
<property name="userDao">
<bean id="temp" class="com.asm.dao.impl.UserDaoImpl"/>
</property>
(3)集合属性注入:
<property name="list">
<list>
<value>List值一</value>
<value>List值二</value>
<value>List值三</value>
</list>
</property>
<property name="set">
<resource和autowired注解的区别set>
<value>Set值二</value>
<value>Set值一</value>
<value>Set值三</value>
</set>
</property>
<property name="map">
<map>
<entry key="one" value="" />
<entry key="two" value="" />
<entry key="three" value="" />
</map>
</property>
<property name="pro">
<props>
<prop key="p1">first</prop>
<prop key="p2">second</prop>
<prop key="p3">third</prop>
</props>
</property>
注意:在相应的字段上一定要有setter 方法,才能注入。
补充:使用继承。在l中的配置如下:
<bean abstract="true" id="parent" >

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