SpringBoot 学习笔记(一)——Spring回顾与SpringMVC基础
来源:互联网 发布:ubuntu 12.04 输入法 编辑:程序博客网 时间:2024/06/05 17:28
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
@Componentpublic 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
@Configurationpublic 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 接受上传的文件
- 将文件写入到磁盘中
- SpringBoot 学习笔记(一)——Spring回顾与SpringMVC基础
- SpringBoot学习笔记(五):SpringBoot与SpringMvc
- SpringBoot学习(一)SpringBoot基础入门
- Spring Boot 学习笔记一(SpringBoot启动过程)
- springmvc学习笔记(31)——spring整合springmvc
- SpringBoot学习-第四章 SpringMVC基础-<Spring Boot 实战>
- springboot 学习笔记(一)
- springboot 学习笔记(一)
- springboot 学习笔记(一)
- Python学习笔记(一)——入门与基础
- Beginning Spring学习笔记——第3章(一)Spring MVC基础
- Beginning Spring学习笔记——第6章(一)Spring事务管理基础
- SpringMVC 基础笔记(一)
- Spring+SpringMVC+MyBaties学习笔记(一)环境搭建
- Spring学习笔记(一)IOC与Spring基础xml配置
- springboot学习笔记(一)
- SpringBoot学习笔记(一)
- SpringBoot学习笔记一
- Kaggle 神器 xgboost
- 网站静态化处理--总述(1)
- VS2015数据断点设置方法
- HeaderGridView——可以添加HeaderView的GridView,已修复HeaderView偏移的BUG
- 自定义java中BeanUtils的赋值和获取方法实现.
- SpringBoot 学习笔记(一)——Spring回顾与SpringMVC基础
- USACO-Section1.4 Mother's Milk
- caffe源码解读之net
- jsp九大内置对象.四大作用域
- hibernate知识点
- 【实习】GPU计算高级工程师的实习面试经验分享
- 第一篇博文
- 网站静态化处理—动静整合方案(2)
- win10 Hyper_v中Ubuntu虚拟机和主机共享文件