11.Spring创建对象

 

Spring

Spring创建对象原理

创建User1, User2, User3实体类

方法1和方法2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package com.course.factory;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class BeanFactory {

/**
* 方法1:通过Class创建
* @param <T>
* @param clazz: .class
* @return
*/
public static <T> T getBean(Class<?> clazz) {
T t = null;
try {
t = (T) clazz.newInstance();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return t;
}

/**
* 方法2
* @param <T>
* @param path: 类的完全限定名
* @return
*/
public static <T> T getBean(String path) {
T t = null;
try {
Class<?> clazz = Class.forName(path);
t = (T) clazz.newInstance();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return t;
}

}

测试类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package com.course.test;

import com.course.factory.BeanFactory;
import com.course.vo.*;

public class Test {

public static void main(String[] args) {
User1 user1 = BeanFactory.getBean(User1.class);
System.out.println(user1.toString());
// User1 [id=1, name=Tom]

User2 user2 = BeanFactory.getBean("com.course.vo.User2");
System.out.println(user2.toString());
// User2 [id=2, name=Jerry]

}
}

方法3

bean.properties

1
2
3
User1=com.course.vo.User1
User2=com.course.vo.User2
User3=com.course.vo.User3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package com.course.factory;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class BeanFactory {

/**
* 方法3:通过类的Key
*/
private static Map<String, String> mappings = new HashMap<>();
static {
Properties properties = new Properties();
InputStream is = BeanFactory.class.getClassLoader().getResourceAsStream("com/course/config/bean.properties");
try {
properties.load(is);
Set<Entry<Object,Object>> entrySet = properties.entrySet();
for (Entry<Object, Object> entry : entrySet) {
mappings.put(entry.getKey().toString(), entry.getValue().toString());
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

public static <T> T getBean(String key) {
T t = null;
try {
String path = mappings.get(key);
Class<T> clazz = (Class<T>) Class.forName(path);
t = clazz.newInstance();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return t;
}

}

测试类

1
2
3
4
5
6
7
8
9
10
11
12
13
package com.course.test;

import com.course.factory.BeanFactory;
import com.course.vo.*;

public class Test {

public static void main(String[] args) {
User3 user3 = BeanFactory.getBean("User3");
System.out.println(user3.toString());
// User3 [id=3, name=Peter]
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package com.course.factory;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Properties;
import java.util.Set;

public class BeanFactory {

/**
* 方法4:用Map存储obj对象
*/
public static Map<String, Object> ioc = new HashMap<>();
static {
Properties properties = new Properties();
InputStream is = BeanFactory.class.getClassLoader().getResourceAsStream("com/course/config/bean.properties");
try {
properties.load(is);
Set<Entry<Object,Object>> entrySet = properties.entrySet();
for (Entry<Object, Object> entry : entrySet) {
String key = entry.getKey().toString();
Class<?> clazz = Class.forName(entry.getValue().toString());
Object obj = clazz.newInstance();
ioc.put(key, obj);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}

测试类

1
2
3
4
5
6
7
8
9
10
11
12
13
package com.course.test;

import com.course.factory.BeanFactory;
import com.course.vo.*;

public class Test {

public static void main(String[] args) {
User3 user3 = (User3) BeanFactory.ioc.get("User3");
System.out.println(user3.toString());
// User3 [id=3, name=Peter]
}
}

得到资源的说明

1.从src目录下面去得到资源文件

1
InputStream is=BeanFactory.class.getClassLoader().getResourceAsStream("com/course/config/bean.properties");

2.从src的根目录下面得到资源文件

1
InputStream is=BeanFactory.class.getResourceAsStream("/bean.properties");

3.从当前类的根目录下面得到资源文件

1
InputStream is=BeanFactory.class.getResourceAsStream("bean.properties");

Spring

Spring容器读取配置文件,根据配置文件创建相应的对象,并将对象放入IoC容器(Map)中,然后应用程序根据id(key)从IoC容器(Map)中取出相应的对象。

以后开发过程中只要看到new操作,就应该使用IoC容器。但是这只针对成员变量,不针对局部变量。

实现IOC和DI要使用的技术:

  1. 配置依赖关系 xml配置文件
  2. xml的解析 dom4j sax(jdk自带的)
  3. 工厂设计模式
  4. 反射技术
  5. 【注解】:通过反射获取注解对象,进而获取注解对象的value
    1
    2
    3
    4
    @WebServlet("/user/getUser")
    public class UserController {

    }
    1
    2
    3
    Class<?> clazz = Class.forName(path);
    WebServlet annotation = clazz.getAnnotation(WebServlet.class);
    String[] value = annotation.value();

最终目的:
程序的高内聚、低耦合

spring官方网站:https://spring.io/

spring相关jar包:

  • spring-aop-4.3.7.RELEASE.jar: Spring对aop的支持
  • spring-aspects-4.3.7.RELEASE.jar: Spring对aspects的支持,aspects是一个AOP开源库
  • spring-beans-4.3.7.RELEASE.jar: Spring对配置文件对象的解析与创建
  • spring-context-4.3.7.RELEASE.jar: Spring上下文的支持包
  • spring-context-support-4.3.7.RELEASE.jar: Spring上下文集成的一些第三方库,例如:定时器
  • spring-core-4.3.7.RELEASE.jar: Spring核心包
  • spring-expression-4.3.7.RELEASE.jar: Spring的相关表达式包
  • spring-instrument-4.3.7.RELEASE.jar: Spring的辅助包
  • spring-instrument-tomcat-4.3.7.RELEASE.jar: Spring的辅助包,对tomcat的支持
  • spring-jdbc-4.3.7.RELEASE.jar: Spring对数据访问的支持,包含JdbcTemplate
  • spring-jms-4.3.7.RELEASE.jar: Spring对消息中间件的支持,可以集成MQ
  • spring-messaging-4.3.7.RELEASE.jar: 同spring-jms-4.3.7.RELEASE.jar
  • spring-orm-4.3.7.RELEASE.jar和spring-oxm-4.3.7.RELEASE.jar: 都是对第三方ORM框架的扩展和集成
  • spring-test-4.3.7.RELEASE.jar: Spring测试包
  • spring-tx-4.3.7.RELEASE.jar: Spring对所有ORM框架的事务支持
  • spring-web-4.3.7.RELEASE.jar: Spring对所有的控制层框架的集成支持
  • spring-webmvc-4.3.7.RELEASE.jar: Spring对SpringMVC的支持
  • spring-webmvc-portlet-4.3.7.RELEASE.jar:
  • spring-websocket-4.3.7.RELEASE.jar: Spring对websocket的支持