Spring Boot学习笔记(一)
一、Spring 回顾
1、声明Bean 的注解
- @Component 组件,没有明确的角色
- @Service 业务逻辑层(service层)使用
- @Repository 数据访问层(dao层)使用
- @Controller 控制器(MVC)
2、注入Bean 的注解
- @AutoWired:Spring 提供的注解
- @Inject:JSR-330提供的注解
- @Resouce:JSR-250提供注解
3、java配置
- @conponent :声明当前类是一个配置类,相当于一个Spring配置的xml文件。
- @Bean:注解在方法上,声明当前方法的返回值为一个Bean。
4、AOP
- 使用@Aspect声明一个切面。
- 使用@After、@Before、@Around可直接将切点作为参数。
- 使用@PointCut注解声明切点。
- 使用@EnableAspectAutoProxy注解开启对Aspect代理的支持。
5、Spring EL和资源调度
@PropertySource 注入配置文件,需指定地址;若使用@Value注入,需要配置一个PropertySourcePlaceholderConfigurer的Bean.
- @Value注解可以实现以下几点
1、注入普通字符串 @Value(“Spring Boot”)
2、注入操作系统属性 @Value(“#{systemProperties[‘os,name’]}”)
3、注入表达式结果 @Value(“#{T(java.lang.random()*100.0)}”)
4、注入其他Bean属性 @Value(testDemo.name)
5、注入文件资源 @Value(“classpath:com./wisely/highlight_spring4/test/test.txt”)
6、注入网址资源 @Value(“http://www.baidu,com“)
- @Value注解可以实现以下几点
注意:文件操作需要添加common-io的依赖
6、对Bean生命周期的支持
(1)、Java配置:使用@Bean 的initMethod和destroyMethod(相当于在xml中配置init-method和destroy-method)
(2)、注解配置:利用JSR-250的@PostConstruct和@PreDestroy。
eg.
BeanDemo.java(java配置)
public class BeanDemo {
public BeanDemo(){
System.out.println("初始化构造函数");
}
public void init (){
System.out.println("init");
}
public void destroy(){
System.out.println("destroy");
}
}
BeanDemo.java(JSR-250)
public class BeanDemo {
public BeanDemo(){
System.out.println("初始化构造函数");
}
@PostConstruct
public void init (){
System.out.println("init");
}
@PreDestroy
public void destroy(){
System.out.println("destroy");
}
}
ServiceDemo.java
@Configuration
@ComponentScan("com.test")
public class ServiceDemo {
@Bean(initMethod = "init",destroyMethod = "destroy") //java配置
BeanDemo beanDemo(){
return new BeanDemo();
}
@Bean //注解方式
BeanDemo beanDemo(){
return new BeanDemo();
}
}
Test.java
public class Test {
public static void main(String[] args){
AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext(Test.class);
BeanDemo beanDemo=context.getBean(BeanDemo.class);
context.close();
}
}
执行结果:
初始化构造函数
init
destroy
说明initMethod在构造函数之后执行,destroyMethod在Bean销毁之前执行。
7、Profile
- 使用@Profile注解或者方法,可以在不同情况下实例化不同的Bean;
eg.
BeanDemo.java (Bean)
public class BeanDemo {
private String content;
public BeanDemo(String content){
this.content=content;
}
public void setContent(String content) {
this.content = content;
}
public String getContent() {
return content;
}
}
ProfileDemo.java
public class ProfileDemo {
@Bean
@Profile("dev")
public BeanDemo beanDemoDev(){
return new BeanDemo("dev-Bean");
}
@Bean
@Profile("prod")
public BeanDemo beanDemoProd(){
return new BeanDemo("prod-Bean");
}
}
Test.java
public class Test {
public static void main(String[] args) {
AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext();
context.getEnvironment().setActiveProfiles("dev");
context.register(ProfileDemo.class);
context.refresh();
BeanDemo beanDemo=context.getBean(BeanDemo.class);
System.out.println(beanDemo.getContent());
context.close();
}
}
执行Test.main方法后输出结果:
dev-Bean
若设置context.getEnvironment().setActiveProfiles(“prod-Bean”)则输出” prod-Bean”;
8、事件
Spring的事件遵循以下流程:
1、自定义事件,集成ApplicationEvent。
2 、定义事件监听器,实现ApplicationListener。
3、使用容器发布事件。
eg.
自定义事件 EventDemo.java
public class EventDemo extends ApplicationEvent{
private String msg;
public EventDemo(Object source,String msg) {
super(source);
this.msg = msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public String getMsg() {
return msg;
}
}
事件监听器 ListenerDemo.java
public class ListenerDemo implements ApplicationListener<EventDemo> {
@Override
public void onApplicationEvent(EventDemo eventDemo) { //对消息进行处理
String msg=eventDemo.getMsg();
System.out.println(msg);
}
}
事件处理类 PublisherDemo.java
@Component
public class PublisherDemo {
@Autowired
private ApplicationContext applicationContext;
public void publisher(String msg){
applicationContext.publishEvent(new EventDemo(this,msg));
}
}
配置类 EventConfig.java
@Configuration
@ComponentScan("com.xfh.test")
public class EventConfig {
}
测试类 Test.java
public class Test {
public static void main(String[] args) {
AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext(EventConfig.class);
PublisherDemo publisherDemo =context.getBean(PublisherDemo.class);
publisherDemo.publisher("Hello spring event");
context.close();
}
}
执行Test.main后结果:
Hello spring event
9、Spring Aware
可以使Bean获得Spring容器的服务。下边是Spring Aware提供的接口,原则是用到那个接口就实现哪个接口。
10、条件注解@Condition
根据某一个特定条件创建一个特定的Bean,通过重写Condition接口,并重写其matches方法来构造判断方法,一般会有多个类实现Condition接口成为判断类,但是在某一条件下至多有一个条件类满足,即matches方法返回true,否则如果有多个条件满足会抛出异常,因为Spring 不知道该执行哪个条件对应的Service。
eg.
条件A–ConditionA.java
public class ConditionA implements Condition {
@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
return false; //返回False
}
}
条件B–ConditionB.java
public class ConditionB implements Condition {
@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
return true; //返回True
}
}
Service接口–ConditionService.java
public interface ConditionService {
public String showCondition();
}
满足条件A的Service–ConditionAServiceImpl.java
public class ConditionAServiceImpl implements ConditionService {
@Override
public String showCondition() {
return "ConditionA";
}
}
满足条件B的Service–ConditionBServiceImpl.java
public class ConditionBServiceImpl implements ConditionService {
@Override
public String showCondition() {
return "ConditionB";
}
}
配置类–ConditionConfig.java
@Configuration
public class ConditionConfig {
@Bean
@Conditional(ConditionA.class) ///满足条件A
public ConditionService conditionAService(){
return new ConditionAServiceImpl();
}
@Bean
@Conditional(ConditionB.class) ///满足条件B
public ConditionService conditionBService(){
return new ConditionBServiceImpl();
}
}
测试类–Main.java
public class Main {
public static void main(String[] args) {
AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext(ConditionConfig.class);
ConditionService conditionService=context.getBean(ConditionService.class);
System.out.println(conditionService.showCondition());
}
}
输出结果:
ConditionB
二、SpringMVC 基础
1、常用注解
- @Controller
- @RequestMapping
- @RequestBody
- @ResponseBody
- @PathVariable
- @RestController
2、拦截器
实现对每一个请求处理前后进行相的业务逻辑操作,可以通过实现HandlerInterceptor接口或继承 HandlerInteceptorAdapter类实现自定义拦截器。
3、@ControllerAdvice
通过@ControllerAdvice可以将对于控制器的全局配置放在同一个位置,注解了@Controller的类的方法可以使用@ExceotionHandler、@initBinder、@ModelAttribute注解到方法上。
- @ExceptionHandler:用于全局控制器里的有效方法。
- @InitBinder:用来设置@WebDataBinder,@WebDataBinder用来自动绑定前台请求参数到Model中。
@ModelAttribute:使全局的@RequestMapping都能获得此处设置的键值对。
其中@ExceptionHandler用的最多,其他两个的使用场景不是很多。
4、SpringMVC高级配置
* 1、文件上传*
SpringMVC中通过配置MultipartResolver来上传文件。在Spring控制器中通过MultipartFile来接受文件,通过MultipartFile[] 接受多个上传的文件。
步骤:
- 添加依赖:
1.commons-io
2.commons-fileupload - 上传文件时form表单要添加enctype=”multipart/form-data”
- 使用MultipartFile 接受上传的文件
- 将文件写入到磁盘中