Springboot可以说是当前最火的java框架了,非常适合于"微服务"思路的开发,大幅缩短软件开发周期。
-
概念
过去Spring充满了配置bean的xml文件,随着spring2.x和JDK1.5带来注解,配置大量减少,到了目前的Spring4.x和Spring Boot,更是推荐java配置的方式(这点和.NET很相似)。
总体来说,Spring框架是轻量级企业开发一个完整解决方案,通过Ioc容器来管理pojo对象,其具有模块化的特点,基本的模块如下:
核心容器:Spring-Core核心工具类,Spring-Beans定义Bean的支持,Spring-Context运行时Spring容器,Spring-Context-Support容器对第三包的支持,Spring-Expression使用表达式语言在运行时查询和操作对象。
AOP:Spring-AOP基于代理的AOP支持,基于AspectJ的AOP支持。
消息:Spring-Messaging对消息架构的和协议的支持。
Web:Spring-Web提供基础的Web集成功能,在Web项目中提供Spring容器,Spring-Webmvc提供基于Servlet的SpringMVC,Spring-WebSocket提供WebSocket功能,Spring-Webmvc-Portlet提供Portlet环境支持(?)。
数据访问:Spring-JDBC提供JDBC访问数据库的支持,Spring-TX提供编程式和声明式的事务支持,Spring-ORM提供对象/关系映射技术支持,Spring-OXM提供对象/xml映射技术支持,Spring-JMS提供JMS支持。
以上介绍的是Spring项目,实际到目前为止,Spring已经形成了完整的生态,有很多相关的项目,包括:Spring Boot使用默认开发配置快速开发;Spring XD简化大数据应用开发;Spring Cloud为分布式系统提供工具集;Spring Data对数据库的支持;Spring Integration通过消息机制对企业集成模式(EIP)的支持;Spring Batch简化批处理操作;Spring Security通过认证和授权保护应用;Spring HATEOAS简化REST服务开发;Spring Social与社交API的集成;Spring AMQP对基于AMQP消息的支持;Spring Mobile可以根据不同设备返回不同页面;Spring for Android提供在Android上消费RESTfulAPI的功能;Spring Web Flow基于Spring MVC提供基于想到流程式的Web应用开发;Spring Web Services提供基于协议的SOAP/Web服务;Spring LDAP简化LDAP开发;Spring Session提供一个API和实现来管理用户会话信息。
Tip:Spring框架4大原则:使用POJO进行轻量级&最小侵入开发;通过依赖注入和基于接口编程实现松耦合;通过AOP和默认习惯进行声明式编程;通过AOP和模板减少模式化代码。
-
实践
可以通过项目构建工具(Maven, Gradle, Ant)快速构建Spring项目,在Eclipse中可以使用Spring Tool Suite工具快速搭建项目,当然使用付费的IDEA(仍不太熟悉)更简便。
在Spring中,常见的注解包括:@Component组件,@Service用于业务逻辑层,@Repository用于数据访问层,@Controller用于展示层,@Autowired注入bean。
Java配置:@Configuration表示当前类是一个配置类,相当于xml文件;@Bean注解用在方法上,声明当前方法的返回值为一个Bean,这部分需要好好理解。
AOP:spring支持AspectJ的注解式切面编程,@Aspect表示切面,@After,@Before,@Around定义建言Advice,其中以上注解参数的拦截规则为切点Pointcut,为了切点复用,可使用@PointCut专门定义切点,其中符合条件的每一个被拦截处为连接点JointPoint。在spring中@Transactional,@Cachable就是一个很好的aop的示例,此外使用aop需要的依赖包括spring-aop, aspectjrt, aspectjweaver。
Bean的Scope:默认为Singleton单例;Prototype每次调用新建一个Bean实例,只需要在class上增加@Scope("prototype")注解;Request,Web项目中,给每个请求建立一个bean实例;Session给每个http Session建立一个Bean;GlobalSession,在portal应用中使用,为全局http会话新建一个示例。
Spring EL: Spring通过@Value注解注入各种资源,包括注入普通字符串、操作系统属性、表达式运算结果、其他Bean属性、文件内容、网址内容、属性文件等,@PropertySource可用于指定属性文件。
Profile: 根据不同环境创建不同的bean,@Profile("prod"),可以通过context.getEnvironment().setActiveProfiles("prod")设置profile。
事件Application Event: 为Bean之间的通信提供支持,指定时间需要继承ApplicationEvent,事件监听器实现ApplicationListener<?>接口,之后通过ApplicationContext发布事件即可。
-
进阶概念
Spring Aware:其本用于Spring框架内部,但当需要访问Spring容器资源时可以使用,比如实现BeanNameAware,ResourceLoaderAware。
多线程:可以通过TaskExecutor来实现多线程编程,使用ThreadPoolTaskExecuotr实现基于线程池的TaskExecutor,通过在配置类添加@EnableAsync开启对异步任务的支持,并在实际执行的Bean方法上使用@Async来声明其是一个异步任务。
1 @Configuration 2 @ComponentScan("com.bjorktech.cayman.web") 3 @EnableAsync 4 public class TaskExecutorConfig implements AsyncConfigurer { 5 @Override 6 public Executor getAsyncExecutor() { 7 ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); 8 taskExecutor.setCorePoolSize(5);// 线程池基础大小 9 taskExecutor.setMaxPoolSize(10);// 最大大小 10 taskExecutor.setQueueCapacity(25);// 支持的处理队列大小 11 taskExecutor.initialize(); 12 return taskExecutor; 13 } 14 15 @Override 16 public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { 17 return null; 18 } 19 }