Spring是 Java 平台流行的 IOC 和 AOP 框架,虽然它自己不针对特定的使用场景,但是 Java 平台的 Web 基因一开始就影响着它,所以我们惯常使用它来开发后端服务。Spring 官方有专门的子项目Spring Web,Spring MVC 就是 Spring Web 的子模块。Spring Web 包含很多其它模块,如Spring WebFlux、Spring Web Service、Spring WebSocket等。 Java 后半程在移动端大放异彩,有另一个 IOC 框架Dagger在背后默默支持,可参看笔者写的从零开始撸一个App-Dagger2,此处不赘述。
IOC
我们可以通过在 XML 文件(使用ClassPathXmlApplicationContext加载)中配置 Bean,然后在代码中使用@Autowired或@Resource(来自 JSR-250,JDK 内置)注入 Bean 实例(作用域可通过scope设置,默认是单例)。
XML 配置稍显繁琐,Sping2.5 开始支持注解注入,只要在 XML 中配置(对应的有@ComponentScan注解),Spring 便会自动扫描指定包中的全部类,查找如@Component,@Service,@Repository,@Controller等注解修饰的类,并创建相应的 Bean。当然,这种方式只能配置本项目内的类。
为了使注解方式可以注入第三方类,从 3.0 开始,Spring 引入了@Configuration。使用 @Configuration 注解修饰的类(使用AnnotationConfigApplicationContext加载)中,可使用@Bean注解修饰返回 Bean 的方法。我们若要复用它处定义的配置类,可使用@Import注解,它的作用雷同于将多个 XML 配置文件导入到单个文件。
XML 配置和注解配置也可以混用,比如使用@ImportResource注解引入 XML 文件。
AOP
两者尽管实现技术不一样,但都是基于代理模式,都是生成一个代理对象。
Spring 会根据目标类是否实现接口来决定使用 JDK 动态代理照旧 CGLIB,当然在符合条件时也可以强制使用 CGLIB()。
Spring AOP 涉及到的注解包罗@Aspect、@Pointcut、@Before、@After、@AfterReturning、@AfterThrowing、@Around、@EnableAspectJAutoProxy等,此处不详述。
Spring MVC 同样是基于 Servlet,像是 IOC 版的 Struts2,当然由于 IOC 的引入,两者的概念和组件大相径庭,但是处置处罚哀求的主干是一致的。
Spring MVC 支持的页面渲染实现,并不包含 JSP。而是Thymeleaf、Freemarker等。
Spring Boot
最后来谈谈 Spring Boot,它是创建在 Spring 之上的一个快速开发框架,旨在简化 Spring 应用的初始搭建以及开发过程。它通过提供默认配置、Starter dependencies等特性,极大地减少了项目标配置工作。
同样的,它不独属于 Web 开发,但我们主要照旧在 Web 范畴使用它。
@ConfigurationProperties
在 Spring Boot 项目中,我们常将大量的参数配置在 application.properties(Spring) 或 application.yml 文件中,然后通过@Value取值,如下:
@Value("${db.userName}")
private String userName;
复制代码
着实通过@ConfigurationProperties注解,我们可以更清新地获取这些参数值:
//@Component 注入
@ConfigurationProperties(prefix="db")
public class DbConfiguration{
public String userName;
}
复制代码
@ConfigurationProperties 并不表示成为 Spring Bean,除非配置类同时标注 @Component 之类的注解,或者在使用方标注@EnableConfigurationProperties注解(发起后者,即按需索取,而非全局可见):