Spring是一个开源框架,Spring是于2003年兴起的一个轻量级的Java开发框架,由Rod Johnson在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为J2EE应用程序开发提供集成的框架。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。Spring的核心是控制反转(IoC)和面向切面(AOP)。简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式)轻量级开源框架
1、说Spring是一个一站式的轻量级开源框架EE开发可分成三层架构,是因为针对JavaEE的三层结构,每一层Spring都提供了不同的解决技术(完整的spring框架可以在一个大小只有1MB多的jar文件里发布,并且spring所需处理开销也是微不足道,同时spring是非入侵的,典型的spring应用中对象不依赖spring特定类)
- WEB层:SpringMVC
- 业务层:Spring的IoC
- 持久层:Spring的JDBCTemplate(Spring的JDBC模板,ORM模板用于整合其他的持久层框架)
2、IOC(控制反转) :spring通过ioc技术促进松耦合。应用ioc时,一个对象依赖的其他对象会通过被动的方式传递过来,而不是这个对象自己创建或查找依赖对象(也可以认为ioc于jndi相反:不是从容器中查找依赖,而是在容器初始化不等对象请求就主动将依赖传递给它)即ioc不必调用者自己去new被调用对象,而是通过spring IOC容器把配置好的bean对象注入,可以通过设置注入即setter方法和构造器注入。bean装载可以通过xml配置设定,也可以同过设定扫描路径,然后通过注解来让容器识别到要装载的bean
3、AOP(面向切向) :允许通过分离应用的业务逻辑与系统服务进行内聚性开发,应用对象只实现他们应做的完成业务逻辑,并不负责其他的系统关注点,如日志或事务支持。
其实面向切面编程,切面与业务是垂直的,不同业务往往都要做一些公共的类似的额外操作,在业务之前做,或在业务之后做,或在业务出了异常时做,或者在业务前后都要做,甚至这些要做的额外操作要用到业务本身的输入参数和业务完成的输出结果。比如业务一般都得记录日志,比如涉及数据更新的业务完成后都得伴随数据库操作,账户各种操作前都要验证用户权限,这些业务伴随的操作往往大致相似,如果每个业务都要写这些操作,特别繁琐,把这些操作提出来就成了切面,与业务分离。xml 和API方式都可以实现aop配置,pointcut是业务,aspect是切面,它俩怎么交互执行,怎么传参和调用结果,都可以通过xml和API方式实现。最牛逼的是,之前看得傻了眼那么繁琐和复杂的xml,api方式用简单直观的aspectj方式竟然能等效实现,用的纯Java标签,在xml 里设一下自动代理。不过仅仅@Aspect容器不识别,要加上@Component 才识别。
Aspect : 就比如在调用某个方法之前要进行其他业务逻辑处理,就是用aspect注解
//定义接口
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MoocMethod {
String value();
}
//aspect注解类
Component
@Aspect//aspectj注解不能够通过类路径自懂检车发现,需要配合component注解或者在xml配置
public class MoocAspect {
@Pointcut("execution(* com.zb.aop.aspectj.biz.*Biz.*(..))")
public void pointcut() {}
@Pointcut("within(com.zb.aop.aspectj.biz.*)")
public void bizPointcut() {}
@Before("pointcut()")
public void before() {
System.out.println("Before.");
}
@Before("pointcut() && args(arg)")//主要是获取参数,可以进行判断
public void beforeWithParam(String arg) {
System.out.println("BeforeWithParam." + arg);
}
@Before("pointcut() && @annotation(moocMethod)")//主要算查询方法名,是否注解,获取的是注解的名
public void beforeWithAnnotaion(MoocMethod moocMethod) {
System.out.println("BeforeWithAnnotation." + moocMethod.value());
}
@AfterReturning(pointcut="bizPointcut()", returning="returnValue")
public void afterReturning(Object returnValue) {
System.out.println("AfterReturning : " + returnValue);
}
@AfterThrowing(pointcut="pointcut()", throwing="e")
public void afterThrowing(RuntimeException e) {
System.out.println("AfterThrowing : " + e.getMessage());
}
@After("pointcut()")
public void after() {
System.out.println("After.");
}
@Around("pointcut()")
public Object around(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("Around 1.");
Object obj = pjp.proceed();
System.out.println("Around 2.");
System.out.println("Around : " + obj);
return obj;
}
}
//接口实现
@Service
public class MoocBiz {
@MoocMethod("MoocBiz save with MoocMethod.")
public String save(String arg) {
System.out.println("MoocBiz save : " + arg);
// throw new RuntimeException(" Save failed!");
return " Save success!";
}
}
//调用
@Test
public void test() {
MoocBiz biz = getBean("moocBiz");
biz.save("This is test.");
}
//输出结果(实际中根据业务用MoocAspect类里面某个方法)
Around 1.
Before.
BeforeWithAnnotation.MoocBiz save with MoocMethod.
BeforeWithParam.This is test.
MoocBiz save : This is test.
Around 2.
Around : Save success!
After.
AfterReturning : Save success!
Process finished with exit code 0
以上是个人的大概总结有不足之处望指正