总的来说spring是一个容器,核心就是个bean ,通过spring容器来对对象的管理,通过配置文件来实现spring对对象的管理。
1.
IOC和AOP
IOC:控制反转。控制权由对象本身交给了spring容器,比如我们在java代码中,每次调用其他类的非静态方法时,都要new一个,某个java类可能要引用好多其他类,就new好多次,这样耦合度很高,现在我通过spring容器来管理对对象的生成,当用户需要哪个bean的时候,直接注入就行,降低耦合度,
AOP:
面向切面编程,使用代理模式增强处理的对象。比如,日志文件,一个系统里面好多都要用到日志,如果每个类都写处理日志文件的类,会增加代码的冗余度,然后我们重新写一个代理,这个类就是个代理类。使用代理模式,然后在配置文件中配置扫描那些需要增强的类,之后就不会在每个类中都写处理日志的代码。减少代码冗余度。
当我们在一个切面类里使用@Before来标注一个方法时,该方法将作为Before增强处理,使用@Before标注时通常要指定一个value属性值,用来指定一个切入点表达式(既可以是一个已有的切入点,也可以直接定义切入点表达式),用于指定该增强处理将被织入那些切入点。
注意:("execution(* cn.huaxia.spring.*.*(..))")第一个星号后面一定要有一个空格。
//定义一个切面
@Aspect
publicclass BeforeAdviceTest {
// 执行cn.huaxia.spring包下的所有方法都做为切入点
@Before("execution(* cn.huaxia.spring.*.*(..))")
publicvoid authority() {
System.out.println("模拟执行权限检查...");
}
}
上面@Aspect@标注BeforeAdviceTest 表明该类是一个切面类,在该切面里定义了一个authority()方法,这个方法本来没有什么特别之处,但是因为使用@Before来标注该方法,这就将该方法转换成一个增强处理。上面程序中使用@Before Annotation标注时,直接指定切入点表达式,指定cn.huaxia.spring下的所有方法都作为切入点。
@Component
publicclass Chineseimplements Person {
@Override
public String sayHello(String word) {
return word;
}
publicvoid eat(String food) {
System.out.println("我正在吃" + food);
}
}
@Aspect
publicclass AfterReturningAdviceTest {
@AfterReturning(pointcut="execution(* cn.huaxia.spring.*.*(..))",returning="obj")
publicvoid log(Object obj){
System.out.println("获取目标方法返回值"+obj);
System.out.println("模拟日志记录功能....");
}
}
从上面Chinese类的代码来看,他是一个如此纯净的Java类,他丝毫不知将被谁来进行增强处理,也不知道将被怎样增强处理---正式这种无知才是"AOP"最大的魅力:目标类可以被无限增强。
<!-- 指定自定搜索Bean组件、自动搜索切面类-->
<context:component-scanbase-package="cn.huaxia.spring">
<context:include-filtertype="annotation"
expression="org.aspectj.lang.annotation.Aspect"/>
</context:component-scan>
<!-- 启动AspectJ支持-->
<aop:aspectj-autoproxy/>
</beans>
2 两种注入方式:setter注入。构造器注入。
3.
事物管理
事务就是对一系列的数据库操作(比如插入多条数据)进行统一的提交或回滚操作,如果插入成功,那么一起成功,如果中间有一条出现异常,那么回滚之前的所有操作。这样可以防止出现脏数据,防止数据库数据出现问题。
开发中为了避免这种情况一般都会进行事务管理。Spring中也有自己的事务管理机制,一般是使用TransactionMananger进行管理,可以通过Spring的注入来完成此功能。