一、注解理解
1.spring注解
1)@Configuration/@ComponentScan/@Bean注解实现java方式的配置。
@Configuration代替xml文件 @ComponentScan指定扫描范围 @Bean代替bean标签2)@Bean、@Component、 @Service、 @Repository 和 @Controller
这几个注解的作用类似 @Bean:表示一个方法实例化、配置或者初始化一个Spring IoC容器管理的新对象。 @Component: 自动被comonent扫描。 表示被注解的类会自动被component扫描 @Repository: 用于持久层,主要是数据库存储库。 @Service: 表示被注解的类是位于业务层的业务component。 @Controller:表明被注解的类是控制component,主要用于展现层 。 区别在于@Bean注解中不包含@Component注解,需要在类上显式写上@Component。@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Component public @interface Service {...}
3)其他
@Autowired autowire=byType 通过类型自动注入 @Qualifier autowire=byName 类型相同时,通过指定beanid注入,类似于@Autowired @PropertySource注入properties等配置文件,通过@value获取配置文件中的值 @PostConstruct 和 @PreDestroy 用于bean 的生命周期。类似于 init-method(InitializeingBean) destory-method(DisposableBean) @Scope注解 作用域 @Lazy(true) 表示延迟初始化 @DependsOn:定义Bean初始化及销毁时的顺序 @Primary:自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常 spring中注解的处理基本都是通过实现接口 BeanPostProcessor 来进行的 @Async异步方法调用4)Spring注解和JSR-330标准注解的区别
@Autowired=@Inject @Component=@Named SR-250标准注解 @Autowired=@Resource2.springMVC注解
1)@RequestMapping 指定URL路径
@RequestMapping(value = "/pets/{petId}", method = RequestMethod.GET, params="myParam=myValue") @RequestMapping(value="/header/id", headers = "Accept=application/json") @RequestMapping(value = "/pets", method = RequestMethod.POST, consumes="application/json") @RequestMapping(value = "/pets/{petId}", method = RequestMethod.GET, produces="application/json") value:指定请求的实际url,支持动态uri method:指定请求的method类型, GET、POST、PUT、DELETE等; params:指定request中必须包含某些参数值,才让该方法处理。 headers:指定request中必须包含某些指定的header值,才能让该方法处理请求。 consumes:指定处理请求的提交内容类型(Content-Type),例如application/json, text/html。 produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回。 2)@RequestParam 绑定request请求参数 public String requestparam4(@RequestParam(value="username",required=false) String username) value:参数名字,即入参的请求参数名字,如username表示请求的参数区中的名字为username的参数的值将传入; required:是否必须,默认是true,表示请求中一定要有相应的参数,否则将抛出异常; defaultValue:默认值,表示如果请求中没有同名参数时的默认值,设置该参数时,自动将required设为false。 3)@PathVariable 用于方法修饰方法参数,将修饰的方法参数变为可供使用的uri变量。@RequestMapping(value="/users/{userId}/topics/{topicId}") public String test( @PathVariable(value="userId") int userId, @PathVariable(value="topicId") int topicId)
4)@ModelAttribute和@SessionAttributes
SpringMVC 支持使用 @ModelAttribute 和 @SessionAttributes 在不同的模型(model)和控制器之间共享数据。 @ModelAttribute 主要有两种使用方式,一种是标注在方法上,一种是标注在 Controller 方法参数上。 当 @ModelAttribute 标记在方法上的时候,该方法将在处理器方法执行之前执行,然后把返回的对象存放在 session 或模型属性中, 属性名称可以使用 @ModelAttribute(“attributeName”) 在标记方法的时候指定,若未指定,则使用返回类型的类名称(首字母小写)作为属性名称。 控制器中的@ModelAttribute方法是在同一控制器中的@RequestMapping方法被调用之前调用的。 一个控制器可以有任意数量的@ModelAttribute方法. 5)@Responsebody与@RequestBody @Responsebody表示该方法的返回结果直接写入HTTP response body中。一般在异步获取数据时使用 @RequestBody该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上; 6)@RestController 组合了@Controller和@ResponseBody,常用于restful接口 @EnableWebMvc 注解会开启一些默认配置,如一些ViewResolver或者MessageConverter等。 7)@ControllerAdvice 通过@ControllerAdvice,我们可以把控制器的全局配置放置在同一个位置, 如:@ExceptionHandler、@InitBinder、@ModelAttribute. 这对注解了@Controller的类有效。 @ExceptionHandler 用于处理器全局异常 @InitBinder 用来设置WebDataBinder,自动绑定前台请求参数到Model中 @ModelAttribute 本来的作用是绑定键值对到Model里,此处是让全局的@RequestMapping都能获取到此处设置的键值对。3.@Transactional事务模块注解
eg:@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = Exception.class)
1)propagation 事务传播行为类型 PROPAGATION_REQUIRED 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。 PROPAGATION_SUPPORTS 支持当前事务,如果当前没有事务,就以非事务方式执行。 PROPAGATION_MANDATORY 使用当前的事务,如果当前没有事务,就抛出异常。 PROPAGATION_REQUIRES_NEW 新建事务,如果当前存在事务,把当前事务挂起。 PROPAGATION_NOT_SUPPORTED 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 PROPAGATION_NEVER 以非事务方式执行,如果当前存在事务,则抛出异常 PROPAGATION_NESTED 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类 似的操作 2)readOnly事务只读 默认false 3)rollbackFor 回滚策略,当遇到指定异常时回滚。 4)timeout 超时时间,秒 5)isolation 事务隔离级别 DEFAULT 采用数据库默认隔离级别 READ_UNCOMMITTED 读未提交的数据(会出现脏读取) READ_COMMITTED 读已提交的数据(会出现幻读,即前后两次读的不一样) REPEATABLE_READ 可重复读,会出现幻读 SERIALIZABLE 串行化(对资源消耗较大,一般不使用)4.AOP相关注解
1)spring aop:代理/CGLIB
2)Aspect 用于注解class类,标明该类为切面类,并启用AspectJ注解,注:在使用时要同@Component一起使用,否则不会被扫描到加入容器 @Pointcut 用于方法,标识方法是切入点并定义表达式 通知建言:@Before、@Around、@After、@AfterReturning、@AfterThrowing 执行顺序 无异常情况:Around->Before->自己的method->Around->After->AfterReturning 异常情况:Around->Before->自己的method->Around->After->AfterThrowing @EnableAspectJAutoProxy 开启Spring对AspectJ的支持二、Spring概要
1.POJO
Spring使用POJO(Plain Old Java Object,普通java对象)来进行企业级开发。
2.Spring组成
包括:核心容器(Core Container)、AOP、消息Messaging、Web、数据访问等部分组成
1)核心容器(Core Container) Spring-Core:核心工具类 Spring-Bean:Bean支持 Spring-Context:运行时spring容器 Spring-Context-Support:Spring容器对第三方包的集成支持 Spring-Expressing:SPEL表达式 2)AOP Spring-AOP:基于代理的AOP支持 Spring-Aspects:基于AspectJ的AOP支持 3)Messaging消息 Spring-Messaging:对消息架构和协议的支持 4)Web Spring-Web:提供基础的web集成功能,在web项目中提供spring支持 Spring-WebMVC:提供基于Servlet的Spring MVC Spring-WebSocket:提供WebSocket功能 Spring-WebMVC-Portlet:提供Portlet环境支持 5)数据访问/集成 Spring-JDBC:提供JDBC支持 Spring-TX:提供对编程式事务和声明式事务的支持 Spring-ORM:提供对 对象/关系 的映射支持 Spring-OXM:提供对 对象/xml 的映射支持 Spring-JMS:提供对JMS的支持3.IOC/DI
控制反转(Inversion of control,IOC)和依赖注入(Dependency injection,DI)在Spring中是同一概念。
控制反转通过依赖注入实现,主要目的是实现”解耦“。 Spring Ioc容器(ApplicationContext)负责创建Bean,并将其注入。4.AOP
1)AspectJ应用到java代码的过程(这个过程称为织入),对于织入这个概念,可以简单理解为aspect(切面)应用到目标函数(类)的过程。
对于这个过程,一般分为动态织入和静态织入,动态织入的方式是在运行时动态将要增强的代码织入到目标类中,这样往往是通过动态代理技术完成的, 如Java JDK的动态代理(Proxy,底层通过反射实现)或者CGLIB的动态代理(底层通过继承实现),Spring AOP采用的就是基于运行时增强的代理技术. ApectJ采用的就是静态织入的方式,即编译期织入,Spring没有采用这种方式。 2)Spring的两种动态代理:Jdk和Cglib java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。 而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。 因为cglib是继承,所以该类或方法最好不要声明成final 。 a.如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP b.如果目标对象实现了接口,可以强制使用CGLIB实现AOP c.如果目标对象没有实现了接口,必须采用CGLIB库,spring会在JDK动态代理和CGLIB之间自动转换。5.Scope种类
1)Singleton:一个Spring容器中,只有一个Bean实例,是Spring的默认配置
2)Prototype:每次调用都创建一个Bean实例 3)Request:Web项目中,对于每个Http Request新建一个实例 4)Session:Web项目中,对于每个Http session新建一个实例 5)GlobalSession:在portal中起作用6.Profile
Profile为不同环境下使用不同的配置,提供支持。
eg:@Profile("dev")/@Profile("proc")/context.getEnvironment().setActiveProfiles("dev"); 指定使用开发环境配置7.@Enable*注解
@Enable*的实质是通过@import注解引入配置类
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Import(SchedulingConfiguration.class) @Documented public @interface EnableScheduling { }
@EnableAspectJAutoProxy 开启对AspectJ的支持
@EnableAsync 开启对异步方法的支持 @EnableScheduling 开启对计划任务的支持 @EnableWebMvc 开启对webMvc的支持 @EnableConfigurationProperties 开启对@ConfigurationProperties注解配置bean的支持 @EnableJpaRepositories开启对Spring Data JPA Repository的支持 @EnableTransactionManagement 开始对注解事务的支持 @EnableCaching 开启对注解缓存的支持8.其他
Spring事件(Application Event)为Bean与Bean之间的通信提供了支持。
Spring Aware接口可以从Spring容器中获取容器信息。 Spring通过在配置类中设置@EnableAsync开启异步任务支持 在Bean方法上使用@Async注解这是一个异步任务 Spring通过在配置类中设置@EnableScheduling开启计划任务支持 在Bean方法上使用@Scheduled注解这是一个计划任务。可以使用cron fixDelay fixRate等。 @Conditonal条件注解 @Conditonal(*)根据是否满足条件来创建Bean9.Spring测试支持
@RunWith/@ContextConfiguration/@ActiveProfiles
@RunWith(SpringJUnit4ClassRunner.class) //1 @ContextConfiguration(classes = {TestConfig.class}) //2 @ActiveProfiles("prod") //3 public class DemoBeanIntegrationTests { @Autowired //4 private TestBean testBean; @Test //5 public void prodBeanShouldInject(){ String expected = "from production profile"; String actual = testBean.getContent();Assert.assertEquals(expected, actual); } }
①SpringJUnit4ClassRunner在JUnit环境下提供
Spring TestContext Framework的功能。 ②@ContextConfiguration用来加载配置 ApplicationContext, 其中classes属性用来加载配置类。 ③@ActiveProfiles用来声明活动的profile。 ④可使用普通的@Autowired注入Bean。 ⑤测试代码三、SringMVC概要
1.在Servlet 2.5及以下的时候只要在web.xml下配置<servlet>元素,指定DispatcherServlet即可
2.在Servlet3.0+无web.xml时,需要实现WebApplicationInitializer接口 3.服务器端推送技术 客户端向服务端发送请求,服务端会抓住这个请求不放,等有数据更新的时候才返回给客户端; 当客户端接收到消息后,再向服务端发送请求,周而复始。这种方式的好处是减少了服务器的请求数量,大大减少了服务器的压力。 @RequestMapping(value="/push",produces="text/eventstream") 这里使用输出的媒体类型为text/eventstream,这是服务器端SSE(Server Send Event服务端发送事件)的支持。 4.测试支持 @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = {MyMvcConfig.class}) @WebAppConfiguration("src/main/resources") public class TestControllerIntegrationTests {...} 5.工作过程 第1步:浏览器发送指定的请求都会交给DispatcherServlet,他会委托其他模块进行真正的业务和数据处理 第2步:DispatcherServlet会查找到HandleMapping,根据浏览器的请求找到对应的Controller,并将请求交给目标Controller 第3步:目标Controller处理完业务后,返回一个ModelAndView给DispatcherServlet 第4步:DispatcherServlet通过ViewResolver视图解析器找到对应的视图对象View 第5步:视图对象View负责渲染,并返回到浏览器四、springboot要点
1.配置
springboot必须设置parent为springboot的parent,引入springboot默认配置。引入web支持 org.springframework.boot spring-boot-starter-parent 1.5.2.RELEASE 添加springboot插件 org.springframework.boot spring-boot-starter-web 创建启动类 import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration;@Configuration @EnableAutoConfiguration @ComponentScan public class Application { public static void main(String\[\] args) { SpringApplication.run(Application.class, args); } } org.springframework.boot spring-boot-maven-plugin
2.调试插件
1)springloader
a.插件方式 只对后台代码起作用(不需要重启,真正的热部署),对前台jsp的修改不起作用。 是以后台进程的方式工作的,需要在任务管理器中手动杀掉javaw.exeorg.springframework.boot spring-boot-maven-plugin org.springframework springloaded 1.2.4.RELEASE repackage exec
b.在项目中引入springloader的jar包,添加VM启动参数。
2)devtools 对java文件的修改会重启服务,jsp不会重启。org.springframework.boot spring-boot-devtools
devtools使用了两个ClassLoader,一个Classloader加载那些不会改变的类(第三方Jar包),另一个ClassLoader加载会更改的类,称为 restart ClassLoader
,这样在有代码更改的时候,原来的restart ClassLoader 被丢弃,重新创建一个restart ClassLoader,由于需要加载的类相比较少,所以实现了较快的重启时间(5秒以内)。3.简介
1)SpringBoot项目只需通过java–jar xx.jar来运行。工程中可使用mvn spring-boot:run运行
2)SpringBoot CLI是Spring Boot提供的控制台命令工具,用于生成基本工程,Springboot提供了大量的starter来简化配置。 3)@SpringBootApplication是Spring Boot项目的核心注解,主要目的是开启自动配置。 实质: @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @Configuration @EnableAutoConfiguration @ComponentScan public @interface SpringBootApplication { Class<?>[] exclude() default {}; String[] excludeName() default {}; } 4)@EnableAutoConfiguration让Spring Boot根据类路径中的jar包依赖为当前项目进行自动配置。 Spring Boot会自动扫描@SpringBootApplication所在类的同级包及下级包里的Bean. 使用@SpringBootApplication注解的exclude参数可以关闭自动配置。 @SpringBootApplication(exclude ={DataSourceAutoConfiguration.class}) 5)src/main/resources下新建一个banner.txt,可以设置个性化的启动logo。 6)我们可以通过Spring提供的@ImportResource来加载xml配置 @ImportResource({"classpath:somecontext.xml","classpath:another-context.xml"}) 7)SpringBoot默认使用Logback作为日志框架。 通过在application.properties中设置spring.profiles.active=prod来指定活动的Profile。 8)@EnableAutoConfiguration@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @Import({ EnableAutoConfigurationImportSelector.class,AutoConfigurationPackages.Registrar.class }) public @interface EnableAutoConfiguration { Class \[\] exclude() default {}; String\[\] excludeName() default {}; }
使用@Import注解导入配置。
EnableAutoConfigurationImportSelector使用SpringFactoriesLoader.loadFactoryNames方法来扫描具有 META-INF/spring.factories文件的jar包, 而的spring-boot-autoconfigure-1.3.0.x.jar里就有一个 spring.factories文件, 此文件中声明了有哪些自动配置。@ConditionalOnBean: 当容器里有指定的Bean的条件下。
@ConditionalOnClass: 当类路径下有指定的类的条件下。 @ConditionalOnExpression: 基于SpEL表达式作为判断条件。 @ConditionalOnJava: 基于JVM版本作为判断条件。 @ConditionalOnJndi: 在JNDI存在的条件下查找指定的位置。 @ConditionalOnMissingBean: 当容器里没有指定Bean的情况下。 @ConditionalOnMissingClass: 当类路径下没有指定的类的条件下。 @ConditionalOnNotWebApplication: 当前项目不是Web项目的条件下。 @ConditionalOnProperty: 指定的属性是否有指定的值。 @ConditionalOnResource: 类路径是否有指定的值。 @ConditionalOnSingleCandidate: 当指定Bean在容器中只有一个, 或者虽然有多个但是指定首选的Bean。 @ConditionalOnWebApplication: 当前项目是Web项目的条件下。 9)SpringBoot推荐使用Thymeleaf作为模板引擎. 在Spring Boot里,模板引擎的页面默认是开启缓存的,如果修改了页面的内容,则刷新页面是得不到修改后的页面的. 因此,我们可以在application.properties中关闭模板引擎缓存