SpringBoot 学习笔记(一)——Spring回顾与SpringMVC基础

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kavu1/article/details/72969261

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

@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提供的接口,原则是用到那个接口就实现哪个接口。

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

@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 接受上传的文件
  • 将文件写入到磁盘中

猜你喜欢

转载自blog.csdn.net/kavu1/article/details/72969261