Spring 轻量级框架, Java EE的春天,当前主流框架java的半壁江山可以说都是它打下来的
Spring设计理念 Spring是面向Bean的编程
Spring 两大核心技术 控制反转(IoC:Inversion of Control ) /依赖注入(DI:Dependency Injection ) 面向切面编程(AOP:Aspect Oriented Programming)
Spring的优点
-
低侵入式设计
-
独立于各种应用服务器
-
依赖注入特性将组件关系透明化,降低了耦合度
-
面向切面编程特性允许将通用任务进行集中式处理
-
与第三方框架的良好整合
控制反转(IoC:Inversion of Control )
意思就是将控制权从代码本身转移到外部容器 记住这句话
示例:
如图:
an类定义了一个安卓手机它实现了pinpai接口
ping类定义了一个苹果手机它实现了pinpai接口
pinpai是一个接口定义了一个show方法
chu类是一个出场人信息
里面定义了一个name购买人pinpai接口用于知道谁实现它
然后声明一个info方法打印。app类先不需要管
test类实现方法打印
刚才在上面提到将控制权从代码本身转移到外部容器下面我们就来控制反转
首先说明下除了test类需要改动其他类和接口不变另外增加一个spring的源文件看下面图来创建
第一步在你的web项目上点击右键鼠标悬浮至MyEclipse
第二步
第三步点击Finish初学使用默认就够了
第四步会出现一个ApplicationContext.xml配置文件Spring配置文件是用于指导Spring工厂进行Bean生产、依赖关系注入及Bean实例分发的“图纸”
第五步在beans组件面定义一个bean元素也称为组件
/* bean相当于new了一个对象 an a=new an()
id是一个实例过后的名称
class是哪个包下的类
*/
<bean id="a" class="com.hhb.sping.an"></bean>
<bean id="p" class="com.hhb.sping.ping"></bean>
<bean id="c" class="com.hhb.sping.chu">
/*定义了一个property的组件name属性中是com.hhb.sping.chu里面定义的pin属性
ref表示注入,值a是上面new的出对象的id为‘a’的
相当于是an a=new an();
c.setPin(a)*/
<property name="pin" ref="a"></property>
/*定义了一个property的组件name属性中是com.hhb.sping.chu里面定义的name属性
value属性赋值名称为黄鶴白
*/
<property name="name" value="黄鹤白"></property>
</bean>
第六步把test改成如下代码
/*ApplicationContext是一个接口,负责读取spring配置文件,管理对象的加载,生成,维护Bean对象与 Bean对象之间的依赖关系,负责Bean的生命周期等
ClassPathXmlApplicationContext是ApplicationContext接口实现类,用于从classpath路径中读取spring配置文件*/
ApplicationContext app=new ClassPathXmlApplicationContext("applicationContext.xml");
//通过ApplicationContext的getBean()方法,根据id来获取Bean的实例
chu c=(chu)app.getBean("c");
//调用打印方法
c.info();
第七步运行结果其他出现的结果是我在里面定义的无参构造函数不用管
这就是一个简单的控制转换示例代码
面向切面编程(AOP)
AOP的目标:让我们可以“专心做事”
AOP原理 将复杂的需求分解出不同方面,将散布在系统中的公共功能集中解决 采用代理机制组装起来运行,在不改变原程序的基础上对代码段进行增强处理,增加新的功能
AOP基本概念
- 增强处理(Advice) 前置增强 后置增强 环绕增强、异常抛出增强、最终增强等类型
- 切入点(Pointcut) 对连接点的特征进行描述
- 连接点(Join Point) 某个位置的执行点
- 切面(Aspect) 横切关注点
- 目标对象(Target object) 被一个或多个切面增强的对象
- AOP代理(AOP proxy) 实现增强处理方法等功能
- 织入(Weaving)整合
下面给大家演示一下使用Spring Aop实现日志输出
首先放进来log4j.properties配置文件
第二步添加前置增强和后置增强这时就需要用到上面的app类了
private static final Logger log=Logger.getLogger(app.class);
//@Before("execution(* com.hhb.sping(..))")
//前置增强方法 该方法添加到目标之前执行
public void before(JoinPoint jp){
log.info("前置增强,调用"+jp.getTarget()+"的"+jp.getSignature()
.getName()+"方法."+"方法。方法参数:"+Arrays.toString(jp.getArgs()));
}
//@AfterReturning(pointcut="execution(* com.hhb.sping.*(..))",returning="resuet")
//后置增强方法 该方法添加到目标方法正常返回之后执行
public void afterReturning(JoinPoint jp,Object resuet){
log.info("前置增强,调用"+jp.getTarget()+"的"+jp.getSignature()
.getName()+"方法"+"方法。方法参数:"+Arrays.toString(jp.getArgs()));
}
第三步在applicationContext.xml里面添加aop:config标签
但是使用这个标签前需要添加aop的名称空间
首先打开ApplicationContext.xml配置文件下面点击Namespaces
勾选第一项就完成引用aop的名称空间
第四步使用切入点标签
<bean id="logger" class="com.hhb.sping.app"></bean>引用app类
<aop:config>切面
<aop:pointcut expression="execution(public void info())" id="pointcut"/>切入点
<aop:aspect ref="logger">
<aop:before method="before" pointcut-ref="pointcut"></aop:before> 前置增强
<aop:after-returning method="afterReturning" pointcut-ref="pointcut" returning="resuet" />后置增强
</aop:aspect>
</aop:config>
第五步运行结果