spirng介绍
为了简化java开发,spring使用4种关键策略:
- 基于POJO的轻量级和最小侵入性编程;
- 通过依赖注入和面向接口实现松耦合;
- 基于切面和惯例进行声明式编程;
- 通过切面和模板减少样板式代码。
依赖注入DI
组装bean
- 使用注解@Component,需要开启注解扫描
- 还需要使用@Named("serverName")
- 在@ComponentScan中可以设计扫描的基础包
- @Autowired自动注入的注解,可以放在类构造器上,也可以放在属性的setter方法上(其实是任何方法上);设置required属性为false,如果没有匹配的bean,将会标记为未装配状态;同时可以用java依赖注入规范中的@Inject注解;
- @Bean注解可以返回方法方法的bean,默认bean的id为方法名,类上加@Configuration注解,等同于<beans>元素
- XML中通过<bean>元素声明一个bean
多环境的配置profile
- 可以使用@Profile注解声明类属于哪个profile
- 使用spring.profiles.active属性激活需要使用的环境profile
- 使用spring.profiles.default属性设置默认的环境
- 集成测试的时候使用@ActiveProfiles注解
条件生成bean
- @Conditional 注解,配置实现了Condition接口的class类,可以根据条件是否生成bean;
@Autowired自动装配歧义
- 产生原因:比如一个自动注入的接口,有多个实现类可以选择的时候;
- 解决方案:(1)使用@Primary注解标注首选的bean;或者xml中设置<bean>元素的primary的属性为true;(2)限定自动装配的bean,使用@Qualifier限定装配bean的ID;
bean的作用域
- 默认情况下spring应用上下文所有的bean都是以单例的形式创建的;
- Spring定义的作用于:
- 单例(Singleton):整个应用只创建一个bean的实例;
- 原型(Prototype):每次注入或者通过spring的上下文获取都会创建一个新的bean实例;
- 绘画(Session):在web应用中,为每个会话创建一个bean实例;
- 请求(Request):在web应用中,为每个请求创建一个bean实例;
注入外部值
- 使用@PropertySource注解和Environment
- 使用占位符${}
- 使用spring表达式语言(SpEL)进行装配:
- SPEL表达式需要放在#{}中
- T()运算符可以得到class对象
面向切面的Spring(AOP)
切面的五种类型通知
- 前置通知(Before):在目标方法被调用之前通知功能;
- 后置通知(After):在目标方法完成之后调用通知,此时不会关心方法的输出是什么;
- 返回通知(After-returning):在目标方法成功执行之后调用通知;
- 异常通知(After-throwing):在目标方法抛出异常后调用通知;
- 环绕通知(Around):在方法的调用前和调用后都执行自定义的行为;
- Spring运行时通知对象:Spring在运行期把切面织入到Spring管理的bean中;
- Spring的AOP基于动态代理实现,只支持方法级别的连接点;
- Spring参考AspectJ方法实现AOP,主要方法execution(* 包命名空间.方法名(..)):
- 括号中的第一个参数*,代表方法的返回值;
- 可以使用or、and、&&、||、!等连接词
- 通过注解可以为代理的类添加新方法;通过@DeclareParents注解或者XML元素<aop:declare-parents>声明以透明的方式为被通知的对象映入额外的接口;
SpringMVC
- SpringMvc的入口是DispatchServlet,由这个前端控制器将请求委托给应用程序的其他组件实际执行处理(SpringMvc的控制器controller);
- 使用MockMvc测试Controller控制器的返回试图;
- 使用Java Validation Api(JSR-303)校验输入的值,比如:Hibernate Validator;javax.validation.constraints包中的注解;
- InternalResourceViewResolver类将视图名称解析成jsp文件;
SpringMVC的高级技术
- 配置multipart解析器处理文件上传;
- 使用@ResponseStatus注解自定义状态码和响应;
添加控制器通知:
- 如果需要统一处理异常需要在多个控制器内加上@ExceptionHandler注解,或者继承一个基类:
- 除了基类的实现方式还可以用@ControllerAdvice注解实现控制器通知;
- 该注解标注的类包含一个或者多个如下类型的方法:@ExceptionHandler、@InitBinder、@ModelAttribute;
- @ControllerAdvice注解本身已经使用了@Component,因此@ControllerAdvice注解所标注的类将会自动被组件扫描获取到,就像带有@Component注解的类一样;
跨重定向请求传递数据
- 通过URL模板进行重定向:model中添加的参数会显示在{}的占位符中,或者占位符中未有的参数,会自动添加作为url的请求参数;
- 使用falsh属性:使用RedirectAttributes提供的addFlashAttributes()方法添加重定向后需要获取的对象;相比于添加到session中,再清除的好处是不需要管理对象;
Spring Web Flow
- 将页面组织成特定的工作流程跳转;
Spring Security
- 过滤器Filter,是Servlet的一种加强版,对用户请求的预处理;
- 拦截器Interceptor,是Aop的实现策略,用于在方法被访问之前进行拦截,然后在之前或者之后(5种方式)加入某些操作;
- Filter和Interceptor的区别
- Filter是基于函数回调的,而Interceptor则是基于Java反射的。
- Filter依赖于Servlet容器,而Interceptor不依赖于Servlet容器。
- Filter对几乎所有的请求起作用,而Interceptor只能对action请求起作用。
- Interceptor可以访问Action的上下文,值栈里的对象,而Filter不能。
- 在action的生命周期里,Interceptor可以被多次调用,而Filter只能在容器初始化时调用一次。
- Filter和Interceptor的执行顺序
- 过滤前-拦截前-action执行-拦截后-过滤后
- Spring Security使用ServletFilter提供各种安全性功能;
Spring中的JDBC
配置数据源
- 通过JDBC驱动程序定义的数据源;
- 通过JNDI查找的数据源;
- 连接池的数据源;
Spring Boot
- Spring Boot Starter,将依赖分组进行整合;
- 自动配置:Spring Boot利用Spring4对条件化配置的支持,合理地推测用用所在的bean,并自动装配他们;
- 命令行接口:Spring Boot的CLI发挥了Groovy编程语言的优势,结合自动配置进一步简化Spring应用的开发;
- Actuator:它为Spring Boot应用添加一定的管理特性;
网友评论