一、使用Spring来简化开发的4种策略
1.基于pojo的轻量级和最小侵入性编程
2.通过依赖注入和面向接口实现松耦合
3.基于切面和惯例进行声明式编程
4.通过切面和模板减少样式代码
二、依赖注入DI
这里我们假设一个程序
public class NewKnight implements Knight{
private Sword sword;
public NewKnight(){
this.sword = new BigSword();
}
@Override
public void test(){
sword.use();
}
}
当我们实例化这个类并调用其重写的test()方法时。
1.我们得实例化BigSword类
2.使用BigSword类对象的use()方法
这样一来,我们就将这个NewKnight与BigSword超级耦合在一起了。不利于调试而且容易出现一连串的BUG。
第二个程序
public class NewKnight implements Knight{
private Sword sword;
public NewKnight(Sword sword){
this.sword = sword;
}
@Override
public void test(){
sword.use();
}
}
这个程序依赖与构造器注入,相当于我们在创建这个骑士时就给他发了一把?,而这个剑具体是那种剑和有什么功能(只要实现sword接口的剑就可了)我们都不知道。这就降低了耦合。
三、装配bean
这里我们使用xml形式。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
//以上是spring的头文件,不必关心
//装配的bean,id为“knight”
<bean id="knight" class="com.fs.model.NewKnight">
//构造器的参数,ref代表连接是id为“sword”的bean
<constructor-arg ref="sword"/>
</bean>
<bean id="sword" class="com.fs.model.GoldenSword"></bean>
</beans>
我们通过上下文Application来创建和装载bean
因为我们用的xml文件来配置bean
所以这里使用ClassPathXmlApplicationContext来作为上下文
测试代码
@Test
public void test(){
ClassPathXmlApplicationContext util = new ClassPathXmlApplicationContext("spring-demo1.xml");
Knight knight = (Knight) util.getBean("knight");
knight.test();
util.close();
}
这样我们就使用完成了。
四、应用切面AOP
我对于AOP的理解呢,就是代理模式。
首先我们给出条件,假如我想以后有钱了给希望工程每天捐款,而我关心的是把钱打给希望工程就可以了,不需要关心钱从哪儿来,到哪儿去。甚至不需要知道谁用掉了。
而希望工程这个类呢就帮我们做前后工作。
上代码
public class NewKnight implements Knight{
private Sword sword;
public NewKnight(Sword sword){
this.sword = sword;
}
@Override
public void test(){
sword.use();
}
@Override
public void testWithAop() {
System.out.println("我捐钱了");
}
}
testWithAop就是我去捐钱方法
public class Singer {
public void before(){
System.out.println("她好牛逼");
}
public void after(){
System.out.println("他真的好牛逼啊!");
}
}
这就是给我加油的希望工程类
我们在xml文件中配置这个切面
//这就是我们的希望工程类
<bean id="singer" class="com.fs.model.Singer"></bean>
//aop文件的头
<aop:config>
//通过ref,设置id为singer的为切面类
<aop:aspect ref="singer">
//定义切点处执行的方法
<aop:pointcut id="whatever" expression="execution(* com.fs.model.NewKnight.test(..))"/>
//在切点方法前执行
<aop:before pointcut-ref="whatever" method="before"/>
<aop:after pointcut-ref="whatever" method="after"/>
</aop:aspect>
</aop:config>
五、使用模板消除重复代码
比如JDBC编程中,我们只关心sql语句,其他的步骤都是繁琐的。
我们可以使用spring来帮助。
六、Bean生命周期和上下文
1.我们可以通过上下文来从Spring容器中通过getBean()方法来得到Bean。
我们使用得较多的是ClassPathXmlApplicationContext
Bean的生命周期
实例化bean对象(通过构造方法或者工厂方法)
设置对象属性(setter等)(依赖注入)
如果Bean实现了BeanNameAware接口,工厂调用Bean的setBeanName()方法传递Bean的ID。(和下面的一条均属于检查Aware接口)
如果Bean实现了BeanFactoryAware接口,工厂调用setBeanFactory()方法传入工厂自身
将Bean实例传递给Bean的前置处理器的postProcessBeforeInitialization(Object bean, String beanname)方法
调用Bean的初始化方法
将Bean实例传递给Bean的后置处理器的postProcessAfterInitialization(Object bean, String beanname)方法
使用Bean
容器关闭之前,调用Bean的销毁方法