简介
Spring框架的本质:通过XML配置去驱动Spring框架以反射执行Java代码。
Spring的IoC
依赖注入可分为3种:
- 设值注入。 通过控制Spring调用setter方法来注入。
- 构造器注入。 通过控制Spring调用有参数的构造器来注入。
- 接口注入。少用
需明确概念:spring核心——依赖注入(DI、Dependency Injection)/ 控制反转(IoC、Inverse of Control)
关于Spring原理及机制,可参考:http://jiwenke.iteye.com/blog/493965以及https://www.cnblogs.com/ITtangtang/p/3978349.html#a1
入门
1、环境配置:
(1)导入JAR包:
(2)增加一个Spring配置文件放在类路径下(或者文件系统路径。命名随意)
2、实例一
(1)POJO类
Dog.java
public class Dog {
String kind;
public String getKind() {
return kind;
}
public void setKind(String kind) {
this.kind = kind;
}
@Override
public String toString() {
return "Dog [kind=" + kind + "]";
}
}
User.java
public class User {
private String name;
private int age;
private Dog dog;
public User(){
}
public User(String name,int age,Dog dog){
super();
this.name = name;
this.age = age;
this.dog = dog;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Dog getDog() {
return dog;
}
public void setDog(Dog dog) {
this.dog = dog;
}
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + ",I have a " + dog + "]";
}
}
(2)测试类
①使用无参构造器:
a.beans.xml配置
b.测试
c.此处发现:
调用构造器和执行setter方法在getBean方法调用之前。因为ApplicationContext默认支持预加载,也就是Spring在创建容器之时,就会自动创建容器中所有的singleton Bean,并立即根据property元素调用setter方法。可以通过在bean元素上指定:lazy-init属性或在beans上指定default-lazy-init属性为true来关闭预初始化。
而BeanFactory并不支持预加载
eg:
测试结果:
②使用有参构造器
3、实例二——国际化支持
(1) 编写两个国际化资源文件(中国、美国)
(2)加载国际化资源文件
容器中一个名为messageSource,类型为ResourceBundleMessageSource的Bean用于管理国际化资源文件。(不能改)
ApplicationContext实现了MessageSource接口
在beans.xml中增加如下配置:
(3)测试
根据国际化消息的key来获取国际化消息
测试结果:
4、实例三——资源访问
(1)使用Resource访问底层资源
InfoBean.java
public class InfoBean {
private Resource resource;
private String charset;
public Resource getResource() {
return resource;
}
public void setResource(Resource resource) {
this.resource = resource;
}
public String getCharset() {
return charset;
}
public void setCharset(String charset) {
this.charset = charset;
}
public void readInfo() throws UnsupportedEncodingException, IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(resource.getInputStream(),charset));
String line ;
while((line = br.readLine())!=null){
System.out.println(line);
}
}
}
(2)beans.xml配置
(3)测试
public void test() throws UnsupportedEncodingException, IOException{
ApplicationContext appContext = new ClassPathXmlApplicationContext("beans.xml");
InfoBean infoBean = (InfoBean)appContext.getBean("info1");
infoBean.readInfo();
}
5、事件机制