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“)

注意:文件操作需要添加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提供的接口,原则是用到那个接口就实现哪个接口。

alt

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 接受上传的文件
  • 将文件写入到磁盘中
原创粉丝点击