2023-2-15 spring+springmvc+springboot 注解详解

spring+springmvc+springboot 注解详解

1、spring

1、spring注解一览:

  • 1、@Bean:作用在方法上,表示将该方法的返回值注册为Bean

  • 2、@Component:作用在类上,表示该类是一个组件,能够被扫描进入ioc容器。

  • 3、@Component衍生注解:@Repository:dao层、@Service:service层、@Controller:controller层

  • 4、自动装配注解:@Autowired:支持类型匹配、@Qualifier:和Autowired配合实现根据id匹配、@Resource:先根据id/name匹配,匹配不到则使用type匹配。

  • 5、@Configuration:本质上也是一个Componet。

  • 6、@ComponentScan:用于扫描组件(即Componet、Componet衍生注解、@Configuration标注的类)。

  • 7、@import({clsss对象1,class对象2,…}): 导入其他组件并注册,可以导入一个类的class对象或者一个class对象的数组。有三种导入类型。

    • 1)导入普通的类的clss对象,这时这个类会被当成是组件类注册进入Ioc中成为一个对象,该对象的id就是其类的全限定名。假如此时该类下使用了@Bean,那么该Bean也会一并注册到ioc,其默认为方法名(可以通过Bean中的value属性指定)。

    • 2)导入ImportSelector接口的实现类:该接口下的方法只有一个,用于返回我们自定义逻辑要注册的组件全类名。

      String[] selectImports(AnnotationMetadata var1)

      返回值是一个类的全限定名的数组列表,供@Import注解导入;参数是当前@Import标注类上的所有注解信息。

    • 3)导入ImportBeanDefinitionRegistrar接口的实现类:注册额外依赖配置,该接口下的方法也只有一个,用于向容器中添加我们自己的依赖。

      void registerBeanDefinitions(AnnotationMetadata var1, BeanDefinitionRegistry var2);
      

      参数有两个:

      • 1)当前标注类上的所有注解信息。

      • 2)BeanDefinitionRegistry:调用该接口实现类下的registerBeanDefinition方法,进行手动注册。

         void registerBeanDefinition(String var1, BeanDefinition var2) 
        
  • 8、@Value:
    作用于属性或set方法之上

  • 9、@Scope:
    等价于bean标签的scope属性

  • 10、整合junit:

    @Runwith 将Junit原有的运行器替换成spring提供的SpringJUnit4ClassRunner。这个注解的值就
    是运行器的字节码文件(SpringJUnit4ClassRunner.clss)。
    @ContextConfiguration 可以通过该属性手工指定 Spring 配置文件所在的位置,可以指定一个或
    多个 Spring 配置文件,并加载。

2、补充:spring @Component和@Bean的区别

  1. @Component和@Bean都是用来定义Spring Bean的注解,但它们的作用和使用方式略有不同。

    • @Component注解用于将一个类标注为Spring中的组件,表示这个类会被Spring容器所管理,并且可以通过容器来进行依赖注入。@Component注解可以与@Autowired等注解一起使用,用来实现依赖注入。它适用于任何类的注入,包括第三方库中的类
    • @Bean注解是用于方法级别的注解,用于告诉Spring容器,这个方法将返回一个对象,该对象应该被注册为一个Bean,并由容器管理。@Bean注解通常用于配置类中的方法,用于手动创建Bean对象,并将其添加到Spring容器中。@Bean注解通常与@Configuration一起使用,用于创建和配置Spring应用程序上下文中的Bean。
  2. spring注册组件有4种方式(组件也是一种bean)

    都在配置类或者配置文件下进行:

    第一种方式:包扫描+注解

    ​ 通过@ComponentScan扫描指定包,将包下的标注@Controller、@Service、@Repository、@Component的bean注册到IOC容器中。

    @Configuration
    @ComponentScan("com.zm.bean")
    	public class TestLifeCycleConfig {}
    
    package com.zm.bean;
    @Component
    public class MyBean {}
    

    第二种方式:@Bean

    ​ 在配置类中使用@Bean注解将方法返回值对象注册到IOC容器中,id默认是方法名称,可通过value参数指定id。

    @Configuration
    public class TestLifeCycleConfig {
        @Bean(value={"dog1","dog2"}, initMethod = "initMethod", destroyMethod="destroyMethod")
        public Dog getDog(){
            return new Dog();
        }
    }
    

    第三种方式:@Import

    ​ 通过@Import注解将Bean注册到IOC容器中。

    @Import({Blue.class, MyImportSelector.class, MyImportBeanDefinitionRegistrar.class})
    

    第四种方式:使用spring提供的FactoryBean(getObject())配合@Bean注册

    ​ 通过工厂bean将bean注册到容器中。

    /**
     * 通过IOC容器根据id(myFactoryBean)获取的是Dog对象
     * 若想获取MyFactoryBean本身的bean对象,可通过id(&+工厂id),即&myFactoryBean
     */
    @Component
    public class MyFactoryBean implements FactoryBean<Dog> {
        /**
         * 通过该方法返回实际bean对象
         * @return
         * @throws Exception
         */
        @Override
        public Dog getObject() throws Exception {
            return new Dog();
        }
     
        /**
         * 实际bean的class类型
         * @return
         */
        @Override
        public Class<?> getObjectType() {
            return Dog.class;
        }
     
        /**
         * 设置bean作用域:单例、多实例
         * @return
         */
        @Override
        public boolean isSingleton() {
            return true;
        }
    }
    
    @Test
        public void test(){
            ApplicationContext applicationContext = new AnnotationConfigApplicationContext(TestLifeCycleConfig.class);
            Object bean = applicationContext.getBean("myFactoryBean");
            System.out.println(bean);
            Object bean1 = applicationContext.getBean("&myFactoryBean");
            System.out.println(bean1);
        }
    
  3. Spring中注册Bean的方式

    第一种方式: XML配置方式

    第二种方式: 使用@Component注解 + @ComponentScan包扫描方式

    第三种方式:@Configuration + @Bean方式

    第四种方式:FactoryBean方式

    第五种方式:@Import方式

    第六种方式:@Import + ImportSelector方式

    第七种方式:@Import + ImportBeanDefinitionRegistrar方式

    第八种方式:BeanDefinitionRegistryPostProcessor方式

    第九种方式:BeanFactoryPostProcessor方式


2、springmvc

  • @RequestMapping 用来表示请求的url ,可以作用在类和方法之上

  • @PathVariable 让方法参数的值对应绑定到一个URI模板变量 上

    @RequestMapping("/add/{a}/{b}")
    public String test1(@PathVariable int a , @PathVariable String b , Model
    model)
    
  • @RequestParam:针对get请求发送到键值对格式

  • @RequestBody:针对于post请求发送过来的json文本对象


3、springboot

  • SpringBootApplication

    • 1)@SpringBootConfiguration :表明当前这个类是springboot主配置类
      • @Target({ElementType.TYPE})
      • @Retention(RetentionPolicy.RUNTIME)
      • @Documented
      • @Configuration
    • 2)@EnableAutoConfiguration :重点,自动扫描装配,扫描加载项目以外的bean到ioc容器中。
      • @AutoConfigurationPackage
        • @Import({Registrar.class}) :获取配置主类所有注解的元信息,配合ComponetScan完成项目的bean注册。
      • @Import({AutoConfigurationImportSelector.class}) :ImportSelector接口功能是根据我们自定义的条件去筛选和自定义的方式去获取配置类的全类名。在springboot中其实现类AutoConfigurationImportSelector作用是利用SpringFactoriesLoader对象扫描所有依赖下的spring.factories,并将里面的数据抽象成为一个map。取出文件中的EnableAutoConguration属性对应的数据以及其bean注册到容器中。
    • 3)@ComponentScan
  • @ConfigurationProperties和@Value注解用于获取当前项目的配置文件中的属性定义并绑定到Java Bean或属性中。两种让@ConfigurationProperties 注解的类生效。

    • 1)使用 @ConfigurationProperties + @Component 注解:

      • 如果一个类只配置了 @ConfigurationProperties 注解,而没有使用 @Component 注解将该类加入到 IOC 容器中,那么它就不能完成 xxx.properties 配置文件和 Java Bean 的数据绑定
    • 2)使用 @EnableConfigurationProperties 注解:

      • /*该注解的作用是使类上标注的 @ConfigurationProperties 注解生效,并且会自动将这个类注入到 IOC 容器中*/
        @EnableConfigurationProperties(MyConfigurationProperties.class)
        
  • EnableConfigurationProperties 注解:@EnableConfigurationProperties 注解的作用是:让使用了 @ConfigurationProperties 注解的类生效,并且将该类注入到 IOC 容器中,交由 IOC 容器进行管理。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值