你所应该知道的spring注解(一)

在说spring注解时我们先看下什么是JAVA注解:Annotation(注解)是JDK1.5及以后版本引入的。它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查。注解是以‘@注解名’在代码中存在的,根据注解参数的个数,我们可以将注解分为:标记注解、单值注解、完整注解三类。它们都不会直接影响到程序的语义,只是作为注解(标识)存在,我们可以通过反射机制编程实现对这些元数据(用来描述数据的数据)的访问。另外,你可以在编译时选择代码里的注解是否只存在于源代码级,或者它也能在class文件、或者运行时中出现(SOURCE/CLASS/RUNTIME)。

Spring注解:最近使用springboot搭建项目时用到了好很多注解有的基本上已经忘记,然后今天抽个空进行深入的总结一波,希望在今后的是使用时更加的游刃有余。以希望能够给各位一些参考吧,同时加深个人的记忆》

注解的好处是什么呢:简化配置,书写方便,但是有时并不方便,还是需要看使用的地方在哪的,这里大大小小介绍了大约有三十多个常用的注解,具体使用请看下文。

   

目录

    组件的添加:

    组件赋值:

    组件注入:

    Aop:

 声明式事务:

SpringMVC注解:


AnnotationConfigApplicationContext:


    组件的添加:


        

@Configuration:告诉spring这是个配置类(等同于配置文件)
        @ComponentScan:指定扫描的包
                @ComponentScans(
                                value = {
                                        @ComponentScan(value="com.atguigu",includeFilters = {
                        /*                        @Filter(type=FilterType.ANNOTATION,classes={Controller.class}),
                                                @Filter(type=FilterType.ASSIGNABLE_TYPE,classes={BookService.class}),*/
                                                @Filter(type=FilterType.CUSTOM,classes={MyTypeFilter.class})
                                        },useDefaultFilters = false)    
                                }
                                )
                        //@ComponentScan  value:指定要扫描的包
                        //excludeFilters = Filter[] :指定扫描的时候按照什么规则排除那些组件
                        //includeFilters = Filter[] :指定扫描的时候只需要包含哪些组件
                        //FilterType.ANNOTATION:按照注解
                        //FilterType.ASSIGNABLE_TYPE:按照给定的类型;
                        //FilterType.ASPECTJ:使用ASPECTJ表达式
                        //FilterType.REGEX:使用正则指定
                        //FilterType.CUSTOM:使用自定义规则
        @Bean:给容器中注册一个Bean;类型为返回值的类型,id默认是用方法名作为id
        @Component:默认加在ioc容器中的组件,容器启动会调用无参构造器创建对象,再进行初始化赋值等操作
        @Controller:声明是一个控制层 名字默认是类名首字母小写
        @Service:声明是service层 名字默认是类名首字母小写 其中自己可以改变这个实例名字:@Service("userService");
        @Repository:声明是dao层。名字默认是类名首字母小写 同样可以自己手动书写实例名称
        @Conditional:
                        /**
                         * @Conditional({Condition}) : 按照一定的条件进行判断,满足条件给容器中注册bean
                         * 
                         * 如果系统是windows,给容器中注册("bill")
                         * 如果是linux系统,给容器中注册("linus")
                         */
                        @Bean("bill")
                        public Person person01(){
                            return new Person("Bill Gates",62);
                        }
                        
                        @Conditional(LinuxCondition.class)
                        @Bean("linus")
                        public Person person02(){
                            return new Person("linus", 48);
                        }
        @Primary:让Spring进行自动装配的时候,默认使用首选的bean;
                     也可以继续使用 @Qualifier指定需要装配的bean的名字
        @Lazy:懒加载:
             单实例bean:默认在容器启动的时候创建对象;
             懒加载:容器启动不创建对象。第一次使用(获取)Bean创建对象,并初始化;
                
        @Scope
                    //默认是单实例的
                        /**
                         * ConfigurableBeanFactory#SCOPE_PROTOTYPE    
                         * @see ConfigurableBeanFactory#SCOPE_SINGLETON  
                         * @see org.springframework.web.context.WebApplicationContext#SCOPE_REQUEST  request
                         * @see org.springframework.web.context.WebApplicationContext#SCOPE_SESSION     sesssion
                         * @return\
                         * @Scope:调整作用域
                         * prototype:多实例的:ioc容器启动并不会去调用方法创建对象放在容器中。
                         *                     每次获取的时候才会调用方法创建对象;
                         * singleton:单实例的(默认值):ioc容器启动会调用方法创建对象放到ioc容器中。
                         *             以后每次获取就是直接从容器(map.get())中拿,
                         * request:同一次请求创建一个实例
                         * session:同一个session创建一个实例
                         * 
                         * 懒加载:
                         *         单实例bean:默认在容器启动的时候创建对象;
                         *         懒加载:容器启动不创建对象。第一次使用(获取)Bean创建对象,并初始化;
                         * 
                         */
        @Import:要导入到容器的组件,容器中就会自动的注册这个组件,id默认是全类名
                        /**
                         * 给容器中注册组件;
                         * 1)、包扫描+组件标注注解(@Controller/@Service/@Repository/@Component)[自己写的类]
                         * 2)、@Bean[导入的第三方包里面的组件]
                         * 3)、@Import[快速给容器中导入一个组件]
                         *         1)、@Import(要导入到容器中的组件);容器中就会自动注册这个组件,id默认是全类名
                         *         2)、ImportSelector:返回需要导入的组件的全类名数组;
                         *         3)、ImportBeanDefinitionRegistrar:手动注册bean到容器中
                         * 4)、使用Spring提供的 FactoryBean(工厂Bean);
                         *         1)、默认获取到的是工厂bean调用getObject创建的对象
                         *         2)、要获取工厂Bean本身,我们需要给id前面加一个&
                         *             &colorFactoryBean
                         */


    组件赋值:


        @Value: @Value赋值;
                    //1、基本数值
                    //2、可以写SpEL; #{}
                    //3、可以写${};取出配置文件【properties】中的值(在运行环境变量里面的值)
                    @Value("张三")
                    private String name;
        自动装配bean: @Autowired通过匹配数据类型自动装配:
                        //标注在方法,Spring容器创建当前对象,就会调用方法,完成赋值;
                        //方法使用的参数,自定义类型的值从ioc容器中获取
                        1)、默认优先按照类型去容器中找对应的组件:applicationContext.getBean(BookDao.class);找到就赋值
                        2)、如果找到多个相同类型的组件,再将属性的名称作为组件的id去容器中查找
                                             applicationContext.getBean("bookDao")
                        3)、@Qualifier("bookDao"):使用@Qualifier指定需要装配的组件的id,而不是使用属性名
                        4)、自动装配默认一定要将属性赋值好,没有就会报错;
                              可以使用@Autowired(required=false);
                        5)、@Primary:让Spring进行自动装配的时候,默认使用首选的bean;
                                 也可以继续使用@Qualifier指定需要装配的bean的名字    
                            @Qualifier
                                        @Qualifier("bookDao"):使用@Qualifier指定需要装配的组件的id,而不是使用属性名
                            @Resources:
                                        可以和@Autowired一样实现自动装配功能;默认是按照组件名称进行装配的;
                                         没有能支持@Primary功能没有支持@Autowired(reqiured=false);
                                        @Resource(name="userDao") 注入userDao根据用户id指定的用户时用到
                                        private BaseDao<User> userdao;
                            @Inject:需要导入javax.inject的包,和Autowired的功能一样。没有required=false的功能;
        @PropertySource:读取外部配置文件中的k/v保存到运行的环境变量中;加载完外部的配置文件以后使用${}取出配置文件的值
                            @PropertySource(value={"classpath:/person.properties"})
        @PropertySources:对比  @ComponentScans()
        @Profile:指定组件在哪个环境的情况下才能被注册到容器中,不指定,任何环境下都能注册这个组件
                      1)、加了环境标识的bean,只有这个环境被激活的时候才能注册到容器中。默认是default环境
                      2)、写在配置类上,只有是指定的环境的时候,整个配置类里面的所有配置才能开始生效
                      3)、没有标注环境标识的bean在,任何环境下都是加载的;


    组件注入:


        方法参数
        构造器
        ApplicationContextAware


    Aop:


        @EnableAspectJAutoProxy:开启AOP功能会给容器中注册一个组件 AnnotationAwareAspectJAutoProxyCreator
                                    AnnotationAwareAspectJAutoProxyCreator是一个后置处理器;
        @Before/@Aftert/@AfterReturning/@AfterThrowing/@Around
        @Pointcut:切点
                    AOP:【动态代理】
                     *         指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式;
                     * 
                     * 1、导入aop模块;Spring AOP:(spring-aspects)
                     * 2、定义一个业务逻辑类(MathCalculator);在业务逻辑运行的时候将日志进行打印(方法之前、方法运行结束、方法出现异常,xxx)
                     * 3、定义一个日志切面类(LogAspects):切面类里面的方法需要动态感知MathCalculator.div运行到哪里然后执行;
                     *         通知方法:
                     *             前置通知(@Before):logStart:在目标方法(div)运行之前运行
                     *             后置通知(@After):logEnd:在目标方法(div)运行结束之后运行(无论方法正常结束还是异常结束)
                     *             返回通知(@AfterReturning):logReturn:在目标方法(div)正常返回之后运行
                     *             异常通知(@AfterThrowing):logException:在目标方法(div)出现异常以后运行
                     *             环绕通知(@Around):动态代理,手动推进目标方法运行(joinPoint.procced())
                     * 4、给切面类的目标方法标注何时何地运行(通知注解);
                     * 5、将切面类和业务逻辑类(目标方法所在类)都加入到容器中;
                     * 6、必须告诉Spring哪个类是切面类(给切面类上加一个注解:@Aspect)
                     * [7]、给配置类中加 @EnableAspectJAutoProxy 【开启基于注解的aop模式】
                     *         在Spring中很多的 @EnableXXX;
            关于Aop模块的注解下次再详细介绍

  

 声明式事务:


        @EnableTransctionManagement:
                开启基于注解的事务管理功能;
        @Transactional
                给方法上标注 @Transactional 表示当前方法是一个事务方法;


SpringMVC注解:


        除了spring的基本注解你还可以使用下面的注解
        @EnableWebMvc:在配置类中开启Web MVC的配置支持,如一些ViewResolver或者MessageConverter等,若无此句,重写WebMvcConfigurerAdapter方法(用于对SpringMVC的配置)
        @RequestMapping("item/{id}")声明请求的url{xxx}叫做占位符,请求的URL可以是“item /1”或“item/2”
        @PathVariable
                    使用(@PathVariable() Integer id)获取url上的数据    

                    /**
                     * 使用RESTful风格开发接口,实现根据id查询商品
                     * 如果不一致,例如"item/{ItemId}"则需要指定名称@PathVariable("itemId")。
                     * @param id
                     * @return
                     */
                    @RequestMapping("item/{id}")
                    @ResponseBody
                    public Item queryItemById(@PathVariable() Integer id) {
                        Item item = this.itemService.queryItemById(id);
                        return item;
                    }
           @ PathVariable 是 获取 url 上数据 的。 @RequestParam获取请求参数的(包括post表单提交)

            @ResponseBody注解,就不会走视图解析器,不会返回页面,目前返回的json数据。如果不加,就走视图解析器,返回页面
            @RequestBody 允许request的参数在request体中,而不是在直接连接在地址后面。(放在参数前)
            
            @NumberFormat 支持对数字类型的属性使用 @NumberFormat 注解
            @DateTimeFormat         – JodaDateTimeFormatAnnotationFormatterFactroy:支持对日期类型的属性使用 @DateTimeFormat 注解 ;可以对pattern 属性:类型为字符串。指定解析/格式化字段数据的模式,
如:”yyyy-MM-dd hh:mm:ss”等其他的
            @RequestParam(name="file") :接收前端传入的参数 required=false或者true来要求@RequestParam配置的前端参数是否一定要传 

其中还有一些springboot这里并没有详细的说明,下次再具体的探讨下》》》其中有不足之处希望大家多多指正!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kay三石 [Alay Kay]

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值