Spring 注解方式引入配置文件

配置文件,我以两种为例,一种是引入Spring的XML文件,另外一种是.properties的键值对文件;

一。引入Spring XML的注解是@ImportResource

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
public @interface ImportResource

@ImportResource有三个属性,value、locations、reader,准确来说是两个,locations和value属性是一样的,都是接受字符串数组,代表导入文件的位置;reader是代表Spring解析文件的类,Spring支持XML或者groovy方式的文件解析,默认的XML解析的reader对象为XmlBeanDefinitionReader的doLoadBeanDefinitions方法;

用法就像下面这样:当然如果不是Spring注解的容器AnnotationConfigApplicationContext,同样可以使用@ImportResource注解,只要开启了注解扫描,并且标注的类已经被Spring管理到了(比如标注了注解@Component等  或者 XML中定义过该bean)

@ImportResource(locations= {"com/lvbinbin/pack1/spring.xml"})
public class AppConfig {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
        String[] names = ac.getBeanDefinitionNames();
        for (String string : names) {
            System.out.println(string+" , "+ac.getBean(string));
        }
    }
}

简而言之,使用@ImportResource生效两个条件,一是开启包扫描 ,当然别的配置也有这种功能,只要满足注册了ConfigurationClassPostProcessor 这个BPP对象,如果不知道有没有这个bean,用上面的方式查看容器中所有的bean有没有这个bean就能知道;

    二是@ImportResource标注的类已经是个bean,被Spring管理到了,上面输出所有bean的方式就可以查看;

二。引入properties文件的注解有一种是 @PropertySource

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Repeatable(PropertySources.class)
public @interface PropertySource

先来介绍@PropertySource的用法

jdbc.properties

jdbcDriver=com.mysql.jdbc.Driver
userName=root
userName_zh=吕彬彬
userName_en=lvbinbin

配置类  当然这个注解是标注在类上的,但是不一定要只能标注在@Configuration注解的类上,只要被Spring管理到的Bean都是可以标注的,然后使用@Value("${}")的方式注入的; 只要PropertySource的文件引入一次,该Spring容器中bean都可以使用@Value来设置属性;

@Configuration
@PropertySource(value= {"pack5/jdbc.properties"})
public class ConfigA {

        @Value("${jdbcDriver}")
        private String jdbcName;

        @Value("${userName_zh}")
        private String userName;

        public static void main(String[] args) {
            AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(ConfigA.class);
            System.out.println(ac.getBean(ConfigA.class).jdbcName);
            System.out.println(ac.getBean(ConfigA.class).userName);
            MutablePropertySources mps = ac.getEnvironment().getPropertySources();
            mps.forEach(ps->{System.out.println(ps.getName());});
        }
}

查看结果:   也验证了这种方式可以注入属性;  下面三行输出就是environment对象中的propertySources集合里已经有的propertySource; 其中最后一行就是这个jdbc.propertySource的name,这是Spring默认生成规则生成的;如果不满意,可以按照下面的方式来生成自定义;

修改注解@PropertySource里的name属性:

@PropertySource(value= {"pack5/jdbc.properties"},name="mysqlJdbcProperties")

测试结果就显示成为这样:

这样@PropertySource的属性说明: 1. name就是该配置文件对应的properySource的name值,你要说用处嘛? 可以通过如下方式指定propertySource的name值来获取配置文件中的键值对;

String res = (String) ac.getEnvironment().getPropertySources().get("mysqlJdbcProperties").getProperty("userName_zh");

                2. value就是配置文件的位置,字符串数组,支持Spring的多种资源写法,classpath、file等;

                3. ignoreResourceNotFound 属性  默认是false,当配置文件不存在的时候,就会抛出异常;true代表没有该文件也没有问题;建议默认即可,这样缺少配置文件时候能够发现问题所在;因为${}这种解析方式 比如键 值不存在,会原样的字符串返回;

                4. encoding 属性就是编码,默认是UTF-8;具体使用效果我也看不出来,如果引入properties文件乱码了,不妨试试修改该属性;

此外,SpringEl表达式也是可以注入属性的,简单介绍下使用方式:其中 environment 是Spring容器中的环境对象的名字,后面直接跟需要的属性,就会遍历PropertySources对象去寻找;

@Value("#{environment[‘userName_en‘]}")
private String userNameEn;

查看输出

lvbinbin

查看Spring日志,证明了这一点;不过我觉得还是 ${}更容易理解一点

原文地址:https://www.cnblogs.com/lvbinbin2yujie/p/10291480.html

时间: 2024-08-02 20:06:43

Spring 注解方式引入配置文件的相关文章

Spring 注解方式实现 事务管理

使用步骤: 步骤一.在spring配置文件中引入<tx:>命名空间<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation

Spring注解式与配置文件式

http://tom-seed.iteye.com/blog/1584632 Spring注解方式bean容器管理 1.通过在配置文件中配置spring组件注入 Xml代码   <context:component-scan base-package="com"/><!---通过该语句可以搜索com及com下子包中的类-> <mvc:annotation-driven/> 2.为Spring编写简单bean类,一般对应接口与具体实现类 例如: a.在

spring 注解方式配置Bean

概要: 再classpath中扫描组件 组件扫描(component scanning):Spring能够从classpath下自动扫描,侦测和实例化具有特定注解的组件 特定组件包括: @Component:基本注解,标示了一个受Spring管理的组件(可以混用,spring还无法识别具体是哪一层) @Respository:建议标识持久层组件(可以混用,spring还无法识别具体是哪一层) @Service:建议标识服务层(业务层)组件(可以混用,spring还无法识别具体是哪一层) @Con

【Quartz】基于Spring注解方式配置Quartz

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka         在上讲[Quartz]Spring3.2.9+Quqrtz2.2.1实现定时实例中,我们使用了XML的方式来配置Quartz定时任务,虽然比用API的方式简便多了,但是Spring还支持基本注解的方式来配置.这样做不仅更加简单,而且代码量也更加少了. 新建一个Java工程,导入要用到的包,Spring3.2.Quartz2.2.1.aopalliance-1.0.jar.co

使用Spring注解方式管理事务与传播行为详解

使用Spring注解方式管理事务 前面讲解了怎么使用@Transactional注解声明PersonServiceBean底下所有的业务方法需要事务管理,那么事务是如何来管理的呢? 我们知道当每个业务方法执行的时候,它都会打开事务,在业务方法执行结束之后,它就会结束事务.那么它什么时候决定这个事务提交,什么时候决定这个事务回滚呢?原先我们手工控制事务的时候,通常这个事务的提交或回滚是由我们来操纵的,那现在我们采用容器的声明式事务管理,那我们如何知道事务什么时候提交,什么时候回滚呢?答案是:Spr

mybaits的注解方式与配置文件方式比较

注解方式比配置文件方式简单了更多. 俩种配置 一个是制定配置文件路径,一个直接class指向dao层接口 只需加一个注解@**** 就能够实现 比写一个xml的配置文件简单更多. 原文地址:https://www.cnblogs.com/gonT-iL-evoL-I/p/11683226.html

spring注解方式实现DI和IOC

注解复习: 1.注解就是为了说明java中的某一个部分的作用(Type) 2.注解都可以用于哪个部门是@Target注解起的作用 3.注解可以标注在ElementType枚举类所指定的位置上 4. 元注解 @Documented    //该注解是否出现在帮助文档中 @Retention(RetentionPolicy.RUNTIME) //该注解在java,class和运行时都起作用 @Target(ElementType.ANNOTATION_TYPE)//该注解只能用于注解上 public

spring 注解方式 事务管理

使用步骤: 步骤一.在spring配置文件中引入<tx:>命名空间<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation

基于已构建S2SH项目配置全注解方式简化配置文件

如果还不熟悉s2sh项目搭建的朋友可以先阅读 eclipse环境下基于已构建struts2项目整合spring+hibernate 这两篇文章熟悉一下. 本文是基于以上两篇文章的基础构建的,以下给出全注解方式配置S2SH项目的参考步骤. 第一步:实体类映射数据库表,简化hibernate通过xml配置文件映射 首先我们新建实体类作为测试,包结构如图所示: 新建User到model包下,实体类字段信息如下所示: package wjt.com.test.model; import javax.pe