说明:
(1)本篇博客的代码,沿用【Spring IoC容器与Bean管理23:使用注解方式实现Spring IoC四:自动装配注解(对象依赖注入);自动装配注解之【按名称装配注解】(@Resource)的使用;】 的s08;
(2)本篇博客的核心是@Value注解;
(3)和【利用XML方式实现Spring IoC容器】相比,【利用注解方式实现Spring IoC容器】是一个妥协和权衡的结果:
目录
一:元数据注解简介
二:案例演示
[email protected]注解
[email protected]注解
[email protected]注解:这个注解在日常开发中很少用到;
[email protected]注解:为某个属性设置静态数值(核心!!!)
(1)引文:@Value注解的不推荐的使用方式
(2)@Value注解的推荐的使用方式:
(3)@Value注解原理分析
(4)config.properties配置文件的几点说明
三:Summary:和【利用XML方式实现Spring IoC容器】相比,【利用注解方式实现Spring IoC容器】是一个妥协和权衡的结果
元数据注解的作用:IoC容器管理对象时,提供一些辅助信息;
一:元数据注解简介
(1)@Primary注解:按类型装配时,如果出现多个相同类型的对象,则优先注入@Primary描述的那个对象;前面已经介绍过了;
(2)@PostConstruct注解:
● init-method在【Spring IoC容器与Bean管理18:Bean对象的作用域及生命周期三:对象生命周期;】中介绍过,是IoC容器对属性进行注入后,自动执行的初始化方法;
● @PostConstruct注解的作用和init-method是作用类似;
(3)@PreDestroy注解:
● destroy-method在【Spring IoC容器与Bean管理18:Bean对象的作用域及生命周期三:对象生命周期;】中介绍过,在销毁IoC容器的过程中,会执行<bean>的destroy-method属性对应的方法;
● @PreDestroy注解的作用和destroy-method是作用类似;
(4)@Scope注解:设置bean的scope属性,即决定这个对象的生存周期;
● 在【Spring IoC容器与Bean管理16:Bean对象的作用域及生命周期一:<bean>的scope属性;(主要是【scope=singleton】和【scope=prototype】的分析和区别)】及后续的几篇文章中,介绍了bean的scope属性,并且演示了如何使用XML的方式去设置;
● @Scope注解,则是【使用注解方式去设置Scope属性】的方式;
(5)@Value注解:为属性注入静态数据;
二:案例演示
[email protected]注解
……………………………………………………
[email protected]注解
……………………………………………………
[email protected]注解:这个注解在日常开发中很少用到;
通过运行结果可以看到,这儿还有问题!~~~ 这儿之所以,没有调用UserService对象的destroy()方法,是因为UserService的@Scope定义为prototype类型,则实例创建之后spring就不在管理了,它只是做了new操作而已,想要使用@preDestroy注解,则需要将scope中的参数改成singleton。
……………………………………………………
[email protected]注解:为某个属性设置静态数值(核心!!!)
(1)引文:@Value注解的不推荐的使用方式
(2)@Value注解的推荐的使用方式:
步骤一:创建配置文件 config.properties代表应用程序的配置信息;比如,上面的UserService的metaData就可以在config.properties中配置: 需要注意,这个配置文件中,如果有多个键值对,需要保证每个键都是不同的;
步骤二:加载配置文件
config.properties文件要想被Spring识别的话,需要在applicationContext.xml文件中将其进行加载:
上面加载好了之后,就可以在UserService类中,使用@Value注解进行引用了:
步骤三:在需要用到配置文件中数据的地方,直接使用@Value("${}")的方式去引用数据
运行,看下效果:发现,其已经成功设置属性了
(3)@Value注解原理分析
@Value原理:在属性上使用@Value注解:其是在运行时,将属性的访问修饰符从private修改为public,然后给属性直接赋值,设置完了之后,再将其改回到private;(即,和@Autowired和@Resource,在属性属性上使用,原理是一样的)
(4)config.properties配置文件的几点说明
● 如config.properties的配置文件的使用很广泛,比如在连接数据库时,数据库的driver,url,username,password等都可以剥离出来,存放到config.priperties中:(以前做项目的时候,自己也是这么干的)
● 一个不错的命名规则:(在实际开发中,可以考虑采用)
三:Summary:和【利用XML方式实现Spring IoC容器】相比,【利用注解方式实现Spring IoC容器】是一个妥协和权衡的结果
(1)至此,Spring核心的注解,就这些了;
(2)这些注解,只是XML配置方式的一种延伸,利用注解开发的体验比利用XMl开发体验要更好;所以,在日常开发中,注解也是主要的开发方式;
(3)和【利用XML方式实现Spring IoC容器】相比,【利用注解方式实现Spring IoC容器】是一个妥协和权衡的结果:
● 注解虽好,但其实这些注解依旧是写在源代码中,如果需要修改注解,还是需要修改源代码;
● XML方式基于配置文件,【不用修改源代码】的特性很强,但是程序员的开发体验不好;注解方式,使用方便,但注解是写死在程序中,不容易维护; 这个问题,也没办法,鱼和熊掌不可兼得;
● 由于Spring框架主要面向Java开发者,作为Spring这个组织来说,实现功能前提下,首先要考虑程序员使用起来是否体验好,如果任何操作都需要大量的XML配置,那么程序员肯定不爱用,那么Spring就会慢慢被淘汰掉,Spring组织也就慢慢不会盈利了;所以,Spring增加注解,也是Spring为了迎合市场(程序员的口味)来设计的;即,增加注解方式,是一个权衡的结果。