Spring学习文档
Spring特点
Spring的最大的目的:是J2EE开发更加容易;
- 简单舒适的面向接口编程;
- Spring是全面的、模块化的、采用分层架构,可以仅选择其中任何一个独立的部分,而它的架构是内部一致的。
- Spring致力于是现有技术更加易用,例如:没有底层业务的事务调度,但是提供了一个凌驾于JTA或其他事务策略的抽象层。
- 使应用程序更加容易测试,是测试驱动项目的一个理想框架。
1.控制反转
控制反转就是指应用本身不负责依赖对象的创建和维护,依赖对象的创建和维护由外部容器来负责,这样控制权就转移到了外部容器,控制权的转移就是所谓的反转;
例如:
public class PersonServiceBean{
private PersonDao personDao =new PersonDaoBean();
public void save (Person person){
personDao.save(person);
}
}
PsersonDaoBean是在应用内部创建及维护的。
当我们把依赖对象交给外部容器负责创建,那么PersonServiceBean类可以改成如下:
public class PersonServiceBean{
priate PersonDao personDao;
public PersonServiceBean(PersonDao personDao){
this,personDao = personDao;
}
public void save(Person person){
personDao.save(person);
}
}
2.依赖注入
在运行期,由外部容器动态的将依赖对象注入到组件中,
注意:由于依赖对象的创建现在已经交给了外部容器,所以容器创建好对象就要注入到应用,这样是通过构造器参数的方式实现的。
3.使用Spring的好处
- 降低组件之间的耦合度,实现软件各层之间的解耦。
- 使用容器能够给我们提供了事务控制等各种服务。
- 提供了单例模式。
- 提供了AOP技术。
- 提供了多个辅助类。
- 对主流框架提供了集成支持。
4.Spring的配置文件名称是随意的
5.Spring的实例化方式
- 在类路径下寻找配置文件进行容器实例化:
ApplicationContext ctx = new
ClassPathXmlApplicationContext(new String[]{“bean.xml”}); - 在文件系统路径下寻找配置文件进行容器实例化:
ApplicationContext ctx = new
FileSystemXmlApplicationContext(new String[]{“D:\bean.xml”});
注意:建议使用类路径,既第一种方式,以为第二种方式是有操作系统差异的,并且可以指定多个配置文件,指定多个时候只需要在String数组中继续添加即可
6.配置文件中配置bean的时候id和name的区别
当用id进行指定bean能出现特殊字符,但是name中可以出现特殊字符。
建议:当没有特殊字符出现的时候尽量用id进行指定。
7.实例化Bean的三种方法
- 使用类构造器实例化:
<bean id = "personService" class = "cn.service.impl.PersonServiceBean"></bean>
- 使用静态工厂方法实例化:
创建一个beanfactory类,这个类是个专门实例化bean的类,里面有一个static方法专门进行bean实例创建,此时beans.xml文件中则应该这样写:
<bean id = "bean实例名称" class = "实例化工厂类的名称" factory-method = "c创建实例的静态方法名"></bean>
- 使用实例工厂方法实例化:
创建一个beanfactory类,在该类中声明一个非static的方法进行bean实例的创建,此时在beans.xml文件中则应该首先对beanfactory类进行实例化然后再进行bean的实例化。写法如下:
<bean id = "bean实例化工厂的名称" class = "实例化工程类的名称"></bean>
<bean id = "bean实力名称" class = "实例化工厂类名称" factory-method = "创建实例的方法名"></bean>
8.Bean的作用域
singleton:在每个Spring IOC容器中一个bean定义只有一个对象实例。如果不指定bean的scope属性的话,即默认是这种作用域,即每次从spring中get的都是同一个实例。并且默认的是在IOC启动的时候对象进行初始化,只有在属性lazy-init设置为true的时候,它才会getBean的时候进行bean的初始化。
9.init-method–初始化方法的设定
如果bean进行实例化的时候我们需要进行一些初始化的方法,那么我们可以通过init-method这个属性进行初始化方法的设定,这时,则会在bean实例以后直接调用init-method中指定的方法。
10.destory-method
我们可以在<bean></bean>
标签中指定destory-moethod属性来指定bean实例销毁之前执行的destory方法,进行实例初始化过程中使用的资源。
11.依赖注入总结
方式一:通过setter方法进行注入的方式
(一)在业务层组件中我们可以声明一个依赖对象的属性,然后通过在beans.xml中配置来实现依赖对象的注入工作,在beans.xml中我们按照下面的方式来编辑;
<bean id = "依赖对象名称" class = "依赖对象的实现类"></bean>
<bean id = "应用业务组件名称" class = "应用业务组件的实现类">
<property name = "应用业务组件类中依赖对象的属性名称" ref = "依赖对象所对应的id"><property>
</bean>
(二)采用内部bean的方式,这种情况下注入的bean就不能注入到其他的业务层组件中了,此时beans.xml的写法如下:
<bean id = "应用业务组件名称" class = "应用业务组件实现类">
<property name = "应用业务组件中依赖对象的属性名">
<bean class = "依赖对象的实现类"></bean>
</property>
</bean>
方式二:使用构造器参数的方式注入
就是在应用业务层组件的构造方法中我们将要使用的依赖对象声明成它的一个属性,然后以参数的方式传入到构造方法,此时bean.xml写法如下:
<bean id = "依赖对象的ID" class = "依赖对象的实现类"></bean>
<bean id = "应用业务层组件ID" class = "应用业务层组件实现类">
<constructor-arq index = "构造器参数索引" type = "依赖对象的实现类" ref = "依赖对象对应的bean的ID"><constructor-arq>
<constructor-arq index = "构造器参数索引" value = "基本类型参数的值"></constructor-arq>
</bean>
12.注入基本类型值得方法
在beans.xml中通过<property></property>
节点的配置类实现,实现方式:/br>
<bean id = "应用业务组件名称" class = "应用业务组件实现类">
<property name = "应用业务组件中要注入的参数名称" value = "要注入的参数值"></property>
</bean>
注意:即使往组件中注入其他类型的数据也是可以实现的,并且集合类型的数值也可以注入到组件中,例如set、list等类型的数据。
13.编程式事务管理
Spring提供了两种方式的编程式事务管理:
(一):使用TransactionTemplate;
(二):直接使用一个PlatformTransactionManager实现;
待续
AOP
- 切面(Aspect);对象操作过程中的截面;
- 连接点(JoinPoint);程序运行过程中的某个阶段点,如某个方法调用,或者某个一场被抛出。
- 处理逻辑(Advice);在某个连接点所采用的处理逻辑;
- 切点(PointCut);一系列连接点的集合,它指明处理方式(Adivce)将在何时被触发。
Spring提供了两张切面声明方式,实际工作中我们可以选用其中一种:
- 基于XML配置方式声明切面;
- 基于注解方式声明切面;
(一)基于注解方式声明切面
-首先启动对@AspectJ注解的支持:在配置文件中使用<aop:aspectj-autoproxy/>
@Aspect
public class LogPrint{
@Prointcut(“execution(.cn.aervice...*(..))”)
private void anyMethod(){}//声明一个切入点
@Before(”anyMethod()&&arge(userName)”)//定义前置通知
public void doAccessCheck(String userName){
}
@AfterReturning(pointcut = “anyMethod()”,returning = “revalue”)//定义后置通知
public void doReturnCheck(String revalue){
}
@AfterThrowing(pointcut = “anyMethod()”,throwing = “ex”)//定义例外通知
public void doExceptionAction(Exception ex){
}
@After(“anyMethod()”)//定义最终通知
public void doReleaseAction(){
}
@Around(“anyMethod()”)//环绕通知
public Object doBasicProfiling(ProceedingJoinPoint pjp)throws Throwable{
return pjp.proceed();
}
}
(二)基于XML配置方式声明切面
public class LogPrint{
public void doAccessCheck(){}//定义前置通知
public void doReturnCheck(){}//定义后置通知
public void doExceptionAction(){}//定义例外通知
public void doReleaseAction(){}//定义最终通知
public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable{
return pjp.proceed();//环绕通知
}
}
xml配置文件: