不知道jar包的dependency怎么写的话 | |
STS下载地址 |
Spring IOC 容器(ApplicationContext) 负责创建bean ,并通过容器将功能类Bean注入到你需要的Bean中。
Spring 提供了4种方式实现Bean的创建和注入
XML配置
注解
Java配置
groovy配置
声明Bean的注解
@Component | 组件 |
业务逻辑层 | |
数据访问层 | |
展现层 |
注入Bean的注解,可注解在Set方法上或属性上,建议注解在属性上,优点是代码更少,层次更清晰。
@Autowired | Spring提供的注解 |
@Inject | JSR-330提供的注解 |
@Resource | JSR-250提供的注解 |
@Configuration | 声明当前类是一个配置类 |
@ComponentScan | 使用它将自动扫描包名下所有使用@Component/@Service/@Repository/@Controller的类,并注册为Bean |
AnnotationConfigApplicationContext作为Spring 容器,接受输入一个配置类作为参数,获得声明配置的Bean。
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(DiConfig.class);
UseFunctionService useFunctionService = context.getBean(UserFunctionService.class;
Java配置
Java配置是Spring 4.X推荐的配置方式,可以完全替代XML配置;Java配置也是Spring Boot推荐的配置方式。
Java配置是通过@Configuration 和@Bean 来实现的。
如何使用Java配置或注解配置呢?
原则: 全局配置使用Java 配置(如数据库相关配置/MVC相关配置),业务Bean的配置使用注解配置(@Component/@Service/@Repository/@Controller)
AOP
AspectJ
@EnableAspectJAutoProxy 开启Spring对AspectJ的支持
使用@AspectJ声明一个切面
使用@After/@Before/@Around定义增强,可以直接将拦截规则(切点)作为参数
其中@After/@Before/@Around 参数的拦截规则为切点 (PointCut), 为了使切点复用,可使用@PointCut专门定义拦截规则,然后再@After/@Before/@Around的参数中使用
其中符合条件的每一个被拦截处为连接点(JoinPoint)
Spring EL-Spring 表达式语言,支持在xml和注解中使用表达式,类似于JSP的EL表达式语言。
@PropertySource("classpath:com/citi/highlight_sprint4/ch2/el/test.properties") 指定文件地址
Bean的初始化和销毁
Java配置方式: 使用@Bean的initMethod 和 destroyMethod,相当于xml配置的init-method 和 destory-method
注解方式: 利用JSR-250的@PostConstruct 和 @PreDestroy
Profile 为不同环境下使用不同的配置提供了支持
Spring 的事件(Application Event) 为Bean 与 Bean 之间的消息通信提供了支持。
1.自定义事件,继承ApplicationEvent.
2.自定义事件监听器,实现ApplicationListener
3.使用容器发布事件
Spring Aware 是Spring 设计用来框架内部使用的,若用了Spring Aware, 你的Bean就会合Spring 容器耦合。
SpringAware 的目的是为了让Bean获得Spring容器的服务。因为ApplicationContext接口集成了MessageSource接口/ApplicationEventPublisher接口/ResourceLoader接口,
所以Bean继承ApplicationContextAware可以获得Spring 容器的所有服务,但原则上还是用到什么接口就实现什么接口。
多线程,配置类实现AsyncConfigurer 接口并重写了getAsyncExecutor方法,返回ThreadPoolTaskExecutor, 这样我们就获得了一个基于线程池的TaskExecutor.
@EnableAsync | 开启对异步任务的支持 |
@Async | 声明其是一个异步任务 |
计划任务
@EnableScheduling | 开启对计划任务的支持 |
@Scheduled | 声明这是一个计划任务 |
条件注解
通过活动的profile,我们可以获得不同的Bean,Spring4提供了一个更通用的基于条件的Bean的创建,即使用@Conditional注解。
@Conditional ,根据满足某一个特定的条件创建一个特定的Bean. 比方说,当某一个Jar包在一个类路径下的时候,自动配置一个或多个Bean;或者只由某个Bean被创建才会创建另外一个Bean。总的来说,就是根据特定条件来控制Bean的创建行为,这样我们可以利用这个特性进行一些自动配置。
组合注解与原注解
@Enable* 注解的工作原理
1.直接导入配置类 @import(SchedulingConfiguration.class)
2.依据条件选择配置类
3.动态注册Bean. 在运行时自动添加Bean到已有的配置类。
测试
Spring通过Spring TestContext Framework对集成测试提供顶级支持。他不依赖于特定的测试框架,即可以使用JUnit也可以使用TestNG
1.Spring JUnitClassRunner在JUnit环境下提供SpringTetContext Framework 的功能。
2.@ContextConfiguration 用来加载配置ApplicationContext,其中classes属性用来加载配置类
3.@ActiveProfiles用来声名活动的Profile
4.可使用普通的@Autowired注入Bean
5.测试代码,通过Junitd 的Assert来校验是否和预期一致。
Spring MVC
@EnableWebMvc | 开启Web MVC的配置支持 |
Sprign MVC 项目快速搭建,Sprint MVC 提供了一个DispatcherServlet来开发Web应用
Servlet 2.5及以下版本 | 在web.xml下配置<Servlet>元素即可 |
Servlet 3.0+无web.xml的配置 | 在Spring MVC 里实现WebApplicationInitializer 接口便可实现等同于web.xml的配置 |
在Spring MVC声明控制器Bean的时候,只能使用@Controller.
Spring MVC的定制配置需要我们的配置类继承一个WebMvcConfigurerAdapter类,并在此类使用@EnableWebMvc注解,来开启对SpringMvc的配置支持,
这样我们可以重写这个类的方法,完成我们的常用配置。
静态资源映射,重写addResourceHandlers(ResourceHandlerRegistry registry) 方法
Registry.addResourceHandler("/assets/**").addResourceLocations("classpath:/assets/");
addResourceLocations -- > 文件放置的目录
addResourceHandler --> 对外暴露的访问路径
拦截器
让普通的Bean实现HandlerInterceptor接口或者继承HandlerInterceptorAdapter类来实现自定义拦截器
通过重写WebMvcConfigurerAdapter的addInterceptors方法来注册自定义的拦截器
@ControllerAdvice | 声明一个增强,它组合了@Component注解,所以自身会自动注解为springd的Bean |
@ExceptionHandler(vvalue = Exception.class) | 通过它的Value属性可过滤拦截的条件。在此我们拦截所有的Exception |
@ModelAttribute | 将键值对添加到全局,然后所有注解了@RequestMapping的方法可以获得此键值对 |
@InitBinder | 通过它定制WebDataBinder |
快捷的ViewController
对于只是简单的页面跳转的请求,我们可以在配置中重写addViewControllers来简化配置。
路径匹配参数配置 | 重写configurePathMatch |