接下来,就可以把读取到的值赋值给类中的2个属性,可以通过@Value注解来实现:
// 以下注解的参数是配置文件的名称 @PropertySource("jdbc.properties") public class JdbcProperties { @Value("${url}") // 在注解参数的大括号的值,是jdbc.properties配置中等于号左侧的名称 private String url; @Value("${driver}") private String driver; // 生成以上2个属性的Getters & Setters }
最后,整个的读取过程是由Spring框架来完成的,所以,以上JdbcProperties类还应该被Spring框架所管理,可以采取组件扫描的做法,则创建SpringConfig类,用于指定组件扫描的包:
// 以下注解参数配置的就是组件扫描的包,同时,请保证JdbcProperties类是在这个包或其子孙包中的 @ComponentScan("cn.tedu.spring") public class SpringConfig { }
然后,在JdbcProperties类的声明之前,补充添加@Component注解,使得Spring框架扫描到这个类时,能明确的知道“这个类是组件类”,从而创建该类的对象:
@Component // 以下注解的参数是配置文件的名称 @PropertySource("jdbc.properties") public class JdbcProperties { @Value("${url}") // 在注解参数的大括号的值,是jdbc.properties配置中等于号左侧的名称 private String url; @Value("${driver}") private String driver; // 生成以上2个属性的Getters & Setters }
全部完成后,可以自定义某个类,用于测试运行:
package cn.tedu.spring; import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class SpringTests { public static void main(String[] args) { // 1. 加载配置类,得到Spring容器 AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfig.class); // 2. 从Spring容器中获取对象 JdbcProperties jdbcProperties = (JdbcProperties) ac.getBean("jdbcProperties"); // 3. 测试 System.out.println(jdbcProperties.getUrl()); System.out.println(jdbcProperties.getDriver()); // 4. 关闭 ac.close(); } }
注意:在类似于jdbc.properties这样的配置文件中,如果某个属性的名称是username,且最终项目是在Windows操作系统的平台上运行时,读取到的值将是“当前登录Windows系统的系统用户名称”,而不是jdbc.properties文件中配置的属性值!所以,一般推荐在编写jdbc.properties这类配置文件时,各属性之前最好都添加一些特有的前缀,使得属性名一定不与某些关键名称发生冲突,例如:
project.jdbc.url=jdbc:mysql://localhost:3399/db_name
project.jdbc.driver=com.mysql.jdbc.Driver
project.jdbc.username=root
project.jdbc.password=1234
并且,在使用@Value注解时,也配置为以上各个等于号左侧的完整名称:
@Component @PropertySource("jdbc.properties") public class JdbcProperties { @Value("${project.jdbc.url}") private String url; @Value("${project.jdbc.driver}") private String driver; @Value("${project.jdbc.username}") private String username; @Value("${project.jdbc.password}") private String password; // Getters & Setters }
最后,使用Spring框架时,如果属性的值是由Spring框架进行赋值的,Spring框架会自动的处理数据类型的转换,所以,在声明属性时,声明为所期望的类型即可,例如,在配置文件中存在:
project.jdbc.initialSize=5
project.jdbc.maxTotal=20
这2个属性分别表示“初始化连接数”和“最大连接数”,应该是数值类型的,在类中声明属性时,就可以使用int或Integer类型:
@Value("${project.jdbc.initialSize}")
private int initialSize;
@Value("${project.jdbc.maxTotal}")
private int maxTotal;
当然,必须保证类型的转换是可以成功的,例如数字5既可以转换为String,又可以是int或Integer,所以,声明以上initialSize时,这几个数据类型都是可用的,根据使用需求进行选取即可!
另外,还有另一种做法读取**.properties**类型的文件,就是使用@Autowired注解为Environment类型的属性自动赋值:
@Component @PropertySource("jdbc.properties") public class JdbcProperties { @Autowired private Environment environment; public Environment getEnvironment() { return environment; } public void setEnvironment(Environment environment) { this.environment = environment; } }
最终,测试运行:
package cn.tedu.spring; import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class SpringTests { public static void main(String[] args) { // 1. 加载配置类,得到Spring容器 AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfig.class); // 2. 从Spring容器中获取对象 JdbcProperties jdbcProperties = (JdbcProperties) ac.getBean("jdbcProperties"); // 3. 测试 System.out.println(jdbcProperties.getEnvironment().getProperty("project.jdbc.url")); System.out.println(jdbcProperties.getEnvironment().getProperty("project.jdbc.driver")); System.out.println(jdbcProperties.getEnvironment().getProperty("project.jdbc.username")); System.out.println(jdbcProperties.getEnvironment().getProperty("project.jdbc.password")); System.out.println(jdbcProperties.getEnvironment().getProperty("project.jdbc.initialSize")); System.out.println(jdbcProperties.getEnvironment().getProperty("project.jdbc.maxTotal")); // 4. 关闭 ac.close(); } }
可以看到,使用这种做法时,Spring框架会把读取到的所有配置信息都封装到了Environment类型的对象中,当需要获取某个配置值时,调用Environment对象的getProperty()方法再获取,同时,getProperty()方法返回的是String类型的数据,如果希望的数据类型不是String,则需要开发人员自行转换类型!
一般,还是推荐使用@Value注解逐一读取各配置值,使用起来更加灵活一些!
抽象类与接口的区别
1. 共同点
都可以包含抽象方法;
2. 区别
抽象类是一种“类”,是使用class作为关键字来声明的;而接口是另一种数据,是使用interface作为关键字来声明的;
抽象类中可以有各种权限不同、修饰符不同的属性,也可以包含普通方法、抽象方法,或者完全没有普通方法,或者完全没有抽象方法;而接口中的所有成员都是public的,所有属性都是static、final的,在JDK 1.8之前,所有的方法都是抽象的;
普通的类与抽象类的关系是“继承”的关系,当普通的类继承了抽象类后,就有义务重写抽象类中的抽象方法,在Java语句中,类之间的继承是1对1的关系;普通的类与接口的关系是”实现“的关系,当普通的类实现了接口后,也有义务重写接口中的所有抽象方法,类与接口的实现关系是1对多的,即1个类可以同时实现若干个接口;接口与接口之间也可以存在继承关系,且是1对多的关系,即某1个接口可以同时继承若干个接口;
3. 使用心得 / 装
类,是描述”类别“的;接口,是描述形为模式、行为特征、规范、标准的!
类与类之间是is a的关系;类与接口之间是has a的关系。
public class Person { public String name; } public class Student extends Person {} public class Teacher extends Person {} public class Animal { } public class Cat extends Animal {} public interface 学习 { void 学习(某参数); } public interface 授课 {} public interface 驾驶 { void 驾驶(某参数); } public class Person implements 学习, 授课, 驾驶 {} Person 张三 = new Person(); Person 李四 = new Person();
附1:Eclipse常用快捷键