学习Spring——两个你熟悉的不能再熟悉的场景使用
2017-03-06 16:48
281 查看
最近公众号受邀获取了留言和赠送模板的权限,小开心(欢迎去公众号JackieZheng围观)。
我们大致的了解了Spring这个框架对于依赖注入的使用和诠释可谓是淋漓尽致。因为有了Spring的这个IOC也好DI也好,我们把上街买菜的事情变成了菜主动送上门的活,这样的“生活方式”大大的提高了我们对于Spring框架的用户体验。
今天主要说两件事,想必凡是稍稍接触过Spring框架开发的对于这些场景肯定都是眼熟透了——Spring如何使用多个外部属性文件以及基于注解方式配置Bean。
1. Spring使用多个外部属性文件
![](https://images2015.cnblogs.com/blog/619240/201611/619240-20161123225215878-1871774800.png)
这个截图并不稀奇,甚至完全看不出什么逻辑,下面分别贴出各个配置文件的内容
beans.xml
jdbc.properites
没错,这就是你绝对见过的,在Spring中最常见对于数据源的配置
你完全可以把jdbc.driver的值写在beans.xml文件中,但是对于大型项目,某一天你需要该其中的配置,那就必须从庞大而臃肿的beans.xml文件找到你要修改的位置,并且胆战心惊的确认是不是还有遗漏的地方。
你完全可以把这些针对性的配置提取到一个外部属性文件当中。写成jdbc.properties的模样,这样修改起来,省时省心省力。
光有以上的配置还是无法工作的,因为spring的beans.xml文件并不知道该去哪里查找相应的变量,并为变量赋值。所以还需要在beans.xml中添加如下标签<context:property-placeholder location="jdbc.properties"/>
测试代码
写上如下的测试方法,可以用来验证上述配置是否正确
![](https://images2015.cnblogs.com/blog/619240/201611/619240-20161123225421550-1075278040.png)
显然我们得到了理想的结果
那么问题来了,如果我们需要使用多个外部属性文件,怎么做?
直接按照上面的套路再拷贝一份试试
beans.xml
test.properties
测试方法
以下是报错信息
报错的主要原因来源于不识别test.driver这个变量。
究其原因是因为beans.xml对于<context:property-placeholder location="jdbc.properties"/>这样的标签,如果有多个这样的定义,只会生效第一个,后面的都会忽略,这就造成了spring没有办法找到test.driver是在哪个文件中定义的。
解决方法
采用通配符的方式,只定义一次,但是可以匹配多个外部属性文件
这样就能够正常运行上面的测试方法。
2.基于注解的方式配置Bean
与之经常同时出场的还有基于XML的方式配置Bean,我想大家都见过或了解autowired=byName和autowired=byType。这两种都是基于XML方式对于Bean采用基于名字和基于类型进行匹配的。
但是这种方式有他的不足之处,所以在实际的项目中应用的不多。
在 Bean 配置文件里设置 autowire 属性进行自动装配将会装配 Bean 的所有属性. 然而, 若只希望装配个别属性时, autowire 属性就不够灵活了.
autowire 属性要么根据类型自动装配, 要么根据名称自动装配, 不能两者兼而有之.
一般情况下,在实际的项目中很少使用自动装配功能,因为和自动装配功能所带来的好处比起来,明确清晰的配置文档更有说服力一些
所以你看到以及用到比较多的应该是基于注解的方式配置Bean
beans.xml
该spring配置文件及其简洁,我们甚至看不到声明bean,只有Context:component-scang该标签意为spring会扫描com.jackie.spring.annotation.generic包下面的所有相关类。相关类是指具有以下字样的注解:
@Component: 基本注解, 标识了一个受 Spring 管理的组件
@Respository: 标识持久层组件
@Service: 标识服务层(业务层)组件
@Controller: 标识表现层组件
标注了如上注解的类都是受Spring管辖的。
同时我们还需要如下几个类
BaseBao.java
BaseService.java
UserBao.java
UserService.java
Main.java
1. 这里BaseBao和UserBao以及BaseService和UserService有一个简单的继承关系。
2. UserBao类上加上了注解@Repository表示其为持久层的bean,UserService类上加上了注解@Service表示其为业务层的bean
3. 这时候执行main方法,会报错
Exception in thread "main" addNew by null
java.lang.NullPointerException
at com.jackie.spring.annotation.generic.BaseService.addNew(BaseService.java:12)
at com.jackie.spring.annotation.generic.Main.main(Main.java:13)
原因很简单,BaseService中不识别BaseBao这个bean,因为我们并没有声明过这个类,也没有注入,这时候需要在该类前加上注解
加上@Autowired表示Spring装配了该bean,从而就不会报空指针异常了。最终执行结果:
4. Spring 还支持 @Resource 和 @Inject 注解,这两个注解和 @Autowired 注解的功用类似
至此,我们熟悉了不能再熟悉的两大场景
Spring如何调用外部属性文件
Spring如何调用多个外部属性文件
Spring基于注解的方式注入bean的使用场景(反正我是一直在用,你们呢???)
我们大致的了解了Spring这个框架对于依赖注入的使用和诠释可谓是淋漓尽致。因为有了Spring的这个IOC也好DI也好,我们把上街买菜的事情变成了菜主动送上门的活,这样的“生活方式”大大的提高了我们对于Spring框架的用户体验。
今天主要说两件事,想必凡是稍稍接触过Spring框架开发的对于这些场景肯定都是眼熟透了——Spring如何使用多个外部属性文件以及基于注解方式配置Bean。
1. Spring使用多个外部属性文件
![](https://images2015.cnblogs.com/blog/619240/201611/619240-20161123225215878-1871774800.png)
这个截图并不稀奇,甚至完全看不出什么逻辑,下面分别贴出各个配置文件的内容
beans.xml
jdbc.properites
你完全可以把jdbc.driver的值写在beans.xml文件中,但是对于大型项目,某一天你需要该其中的配置,那就必须从庞大而臃肿的beans.xml文件找到你要修改的位置,并且胆战心惊的确认是不是还有遗漏的地方。
你完全可以把这些针对性的配置提取到一个外部属性文件当中。写成jdbc.properties的模样,这样修改起来,省时省心省力。
光有以上的配置还是无法工作的,因为spring的beans.xml文件并不知道该去哪里查找相应的变量,并为变量赋值。所以还需要在beans.xml中添加如下标签<context:property-placeholder location="jdbc.properties"/>
测试代码
写上如下的测试方法,可以用来验证上述配置是否正确
![](https://images2015.cnblogs.com/blog/619240/201611/619240-20161123225421550-1075278040.png)
显然我们得到了理想的结果
那么问题来了,如果我们需要使用多个外部属性文件,怎么做?
直接按照上面的套路再拷贝一份试试
beans.xml
test.properties
测试方法
报错的主要原因来源于不识别test.driver这个变量。
究其原因是因为beans.xml对于<context:property-placeholder location="jdbc.properties"/>这样的标签,如果有多个这样的定义,只会生效第一个,后面的都会忽略,这就造成了spring没有办法找到test.driver是在哪个文件中定义的。
解决方法
采用通配符的方式,只定义一次,但是可以匹配多个外部属性文件
2.基于注解的方式配置Bean
与之经常同时出场的还有基于XML的方式配置Bean,我想大家都见过或了解autowired=byName和autowired=byType。这两种都是基于XML方式对于Bean采用基于名字和基于类型进行匹配的。
但是这种方式有他的不足之处,所以在实际的项目中应用的不多。
在 Bean 配置文件里设置 autowire 属性进行自动装配将会装配 Bean 的所有属性. 然而, 若只希望装配个别属性时, autowire 属性就不够灵活了.
autowire 属性要么根据类型自动装配, 要么根据名称自动装配, 不能两者兼而有之.
一般情况下,在实际的项目中很少使用自动装配功能,因为和自动装配功能所带来的好处比起来,明确清晰的配置文档更有说服力一些
所以你看到以及用到比较多的应该是基于注解的方式配置Bean
beans.xml
该spring配置文件及其简洁,我们甚至看不到声明bean,只有Context:component-scang该标签意为spring会扫描com.jackie.spring.annotation.generic包下面的所有相关类。相关类是指具有以下字样的注解:
@Component: 基本注解, 标识了一个受 Spring 管理的组件
@Respository: 标识持久层组件
@Service: 标识服务层(业务层)组件
@Controller: 标识表现层组件
标注了如上注解的类都是受Spring管辖的。
同时我们还需要如下几个类
BaseBao.java
BaseService.java
UserBao.java
UserService.java
Main.java
1. 这里BaseBao和UserBao以及BaseService和UserService有一个简单的继承关系。
2. UserBao类上加上了注解@Repository表示其为持久层的bean,UserService类上加上了注解@Service表示其为业务层的bean
3. 这时候执行main方法,会报错
Exception in thread "main" addNew by null
java.lang.NullPointerException
at com.jackie.spring.annotation.generic.BaseService.addNew(BaseService.java:12)
at com.jackie.spring.annotation.generic.Main.main(Main.java:13)
原因很简单,BaseService中不识别BaseBao这个bean,因为我们并没有声明过这个类,也没有注入,这时候需要在该类前加上注解
至此,我们熟悉了不能再熟悉的两大场景
Spring如何调用外部属性文件
Spring如何调用多个外部属性文件
Spring基于注解的方式注入bean的使用场景(反正我是一直在用,你们呢???)
相关文章推荐
- 学习Spring——两个你熟悉的不能再熟悉的场景使用
- 学习Spring——两个你熟悉的不能再熟悉的场景使用
- Spring参考手册-第一章 绪论-1.2使用场景
- NetTiers学习笔记06---使用场景比较
- ITCAST视频-Spring学习笔记(使用Spring配置文件实现AOP)
- spring包使用详解 --- 传智播客spring视频学习自总结
- 请定义一个宏,比较两个数a、b的大小,不能使用大于、小于、if语句。
- 学习使用Spring应该能具有过滤的能力.
- 几个问题(十)-------spring的IOC、AOP的使用场景
- ITCAST视频-Spring学习笔记(使用Spring的注解方式实现AOP入门)
- ITCAST视频-Spring学习笔记(使用CGLIB实现AOP功能与AOP概念解释)
- WebSphere6.x中不能使用Spring的session scope注入对象的解决办
- 项目中使用Spring时配置web.xml的listener侦听接口不能初始化的问题
- SCA学习之2--SCA中使用SPRING笔记
- FastSpring学习笔记二(使用工具MyGeneration生成Model和NHibernate的代码 )
- ITCAST视频-Spring学习笔记(使用Spring的注解方式实现AOP的细节)
- Spring使用hibernateTemplate不能save对象的问题.
- FastSpring学习笔记二(使用工具MyGeneration生成Model和NHibernate的代码 )
- .NET Remoting学习总结之一:Remoting的使用场景
- Spring视频学习(十)使用XML配置事务