第二章 第一个Spring程序
1.软件版本
- JDK1.8+
- Maven3.5+
- IDEA2018+
- 当Maven是3.6,IDEA是2019时会存在配合上的问题
- SpringFramework5.1.4
2.环境搭建
-
Spring的jar包
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.1.4.RELEASE</version> </dependency>
-
Spring的配置文件
1. 配置文件的放置位置 任意位置,没有硬性要求,一般在resource目录下 2. 配置文件的命名 没有硬性要求,建议application.xml 应用Spring框架时,需要进行配置文件路径的设置
3.Spring的核心API
-
ApplicationContext
作用:ApplicationContext工厂或者容器,用于对象的创建 好处:解耦合
-
ApplicationContext接口类型
接口:屏蔽实现的差异 非Web环境 : ClassPathXmlApplicationContext(main junit) Web环境 : XmlWebApplicationContext
-
重量级资源
ApplicationContext工厂的对象占用大量内存 不会频繁创建对象 : 一个应用只会创建一个工厂对象 ApplicationContext工厂 : 一定是线程安全的(并发访问)
-
4.程序开发
1. 创建类型
public class User {
private String username;
private String password;
...
2. 配置文件的配置 applicationContext.xml
<bean id="user" class="com.dong.User"/>
3. 通过工厂类,获得对象
//1.获得Spring工厂
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("/applicationContext.xml");
//2.通过工厂类获得对象
User user = (User)context.getBean("user");
5.细节分析
-
名词解释
Spring工厂创建的对象,叫做bean或者组件(componet)
-
Spring工厂相关方法
@Test public void test() { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("/applicationContext.xml"); //getBean方法重载id User user = (User)context.getBean("user"); System.out.println(user); //getBean方法重载class,只能有一个class是User的id User user = context.getBean(User.class); System.out.println(user); //getBean方法重载id和class User user = context.getBean("user", User.class); System.out.println(user); //获取Spring工厂配置文件中所有bean标签的id值 String[] names = context.getBeanDefinitionNames(); for (String name : names) { System.out.println(name); } //根据类型获得Spring配置文件中对应的id值 String[] names = context.getBeanNamesForType(User.class); for (String name : names) { System.out.println(name); } //用于判断是否存在指定id值得bean boolean user = context.containsBeanDefinition("user"); System.out.println(user); //用于判断是否存在指定id值得bean boolean user = context.containsBean("user"); System.out.println(user); }
-
配置文件中需要注意的细节
1. 只配置class属性 <bean class="com.dong.User"/> a)上述配置,有没有id值? com.dong.User#0(没有设置id的bean从0开始) b)应用场景 : 这个bean只使用一次 2. name属性 作用 : 给bean设置别名 与id的相同点: 1. context.getBean("id|name")-->Object 2. <bean id="" class=""等效<bean name="" class="" 与id的不同点: 1. 别名可以设置多个,id只能设置一个 <bean name="p,p1..." 2. XML的id属性值,命名要求 : 必须以字母开头,以字母\数字\下划线\连字符组成 name属性值,命名没有要求 XML发展到今天,id属性值的限制已经不存在了,id和name是历史遗留的问题 3. 代码 //用于判断是否存在指定id值的bean,不能判断name值 boolean user = context.containsBeanDefinition("user"); System.out.println(user); //用于判断是否存在指定id值的bean,可以判断name值 boolean user = context.containsBean("user"); System.out.println(user);
6.Spring工厂的底层实现原理(简易版)
Spring工厂是可以调用对象私有的构造方法创建对象
7.思考
问题:在开发过程中,是不是所有的对象,都会交由Spring工厂来创建?
回答:理论上,是的
特例:实体对象(entity)是不会交由Spring创建,它由持久层框架来创建