1.Spring框架
框架(Framework):在Java开发领域中,具体的表现为一系列的jar文件,它通常约定了一些特殊的数据处理流程或编程方式,以解决特定的问题。
Spring框架主要解决的问题是:创建对象,并管理对象。简单的说,在传统开发模式下,当需要某个对象时,可以在项目中编写例如User user = new User();
这样的代码来创建对象,也可以通过user.setName("Alex");
这样的方式来为其中的属性赋值,或者将其声明为public static User user;
以添加static
修饰符使之在内存中的存在时间更长等等,当使用Spring框架后,就不必再写以上这些代码了,相关的工作就可以交给Spring框架来完成,主要是通过配置文件或注解来解决这些问题。
2. 创建基于Spring框架的项目
创建Maven Project,在创建过程中,勾选Create a simple Project,Group Id为 ***
,Artifact Id为***
,Packaging选择jar
(或者war)。
创建完成之后,Spring项目需要在pom.xml中添加spring-context
的依赖,关于依赖的代码,可以在https://mvnrepository.com/
搜索该依赖的名称,确定所使用的依赖及版本,然后,在pom.xml中手动添加<dependencies>
节点,粘贴从网站上搜索到的依赖的代码:
<dependencies> <!-- https://mvnrepository.com/artifact/org.springframework/spring-context --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.1.5.RELEASE</version> </dependency> </dependencies>
3. 通过Spring框架获取对象
首先在src/main/resources下创建XML文件清空,并添加如下代码(这个XML文件就是spring的配置文件)
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:util="http://www.springframework.org/schema/util" xmlns:jpa="http://www.springframework.org/schema/data/jpa" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd"> </beans>
3.1. 通过无参数构造方法创建对象(被创建的类必须要有无参构造方法)
假设需要通过Spring创建一个日期类型的对象,可以在配置文件中添加:
<!-- 通过Spring框架创建Date对象 -->
<!-- id属性:自定义名称,表示Bean Id,后续将通过这个值获取对象,通常推荐使用类名将首字母改为小写 -->
<!-- class属性:需要创建哪个类的对象,取值是类的全名 -->
<bean id="date" class="java.util.Date"></bean>
添加完成后,如果启动Spring,Spring框架就会自动创建java.util.Date
类的对象,并且对象名为date
,开发人员就可以通过date
这个名称获取到对象了!
测试:
创建一个带main()
方法的类,加载以上配置文件,就可以得到Spring容器,并从容器中获取所需的对象:
public class Test { public static void main(String[] args) { // 加载Spring配置文件,获取Spring容器 ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); // 从Spring容器中获取对象,调用getBean()方法时,参数就是配置文件中的Bean Id Date date = ac.getBean("date", Date.class); // 测试 System.out.println(date); // 关闭 ac.close(); } }
3.2. 通过静态工厂方法创建对象
静态工厂方法:某个类中存在方法,该方法是使用static
修饰的,并且,该方法的返回值类型就是当前类的类型,例如Calendar
类就存在静态工厂方法,该类中存在:
public static Calendar getInstance() { // ... }
由于Calendar
是一个抽象类,不可能通过new Calendar()
这样的语法创建对象,所以,需要创建对象,就通过以上静态工厂方法,在Spring的配置文件中:
<!-- factory-method:工厂方法的名称 -->
<bean id="calendar" class="java.util.Calendar" factory-method="getInstance"></bean>
测试:
public class Test {
public static void main(String[] args) {
// 加载Spring配置文件,获取Spring容器
ClassPathXmlApplicationContext ac
= new ClassPathXmlApplicationContext("applicationContext.xml");
// 从Spring容器中获取对象,调用getBean()方法时,参数就是配置文件中的Bean Id
calendar Calendar= ac.getBean("calendar", Calendar.class);
// 测试
System.out.println(Calendar);
// 关闭
ac.close();
}
}
3.3. 通过实例工厂方法创建对象
如果某个类不能通过无参数构造方法创建对象(根本就没有无参数构造方法,或者是抽象类),也没有静态工厂方法,但是,只要有实例工厂方法,也是可以由Spring创建对象的!
实例工厂方法:另外有一个类中存在方法,可以创建所需要的类的对象!例如需要创建UserDao
类,但是,UserDao
不满足无参数构造方法和静态工厂方法的前提,却存在UserDaoFactory
类,这个类中有某个方法的返回值类型是UserDao
,就可以了,这个返回UserDao
类型的方法就是实例工厂方法,在实际操作时,需要先创建出UserDaoFactory
的对象(实例),然后,再调用创建出来的对象的方法,以得到UserDao
类型的对象。
如下:
public class UserDao { public UserDao(Object object) { } }
public class UserDaoFactory { public UserDao newInstance() { return new UserDao(null); } }
在配置时,需要先配置UserDaoFactory
,使得Spring能创建出工厂类UserDaoFactory
的对象,然后,在配置UserDao
时,通过factory-bean
以指定工厂:
<!-- factory-bean:调用哪个Bean的工厂方法,以创建当前类的对象,取值为Bean Id --> <bean id="userDaoFactory" class="cn.tedu.spring.UserDaoFactory"></bean> <bean id="userDao" class="cn.tedu.spring.UserDao" factory-bean="userDaoFactory" factory-method="newInstance"></bean>
测试:
public class Test { public static void main(String[] args) { // 加载Spring配置文件,获取Spring容器 ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); // 从Spring容器中获取对象,调用getBean()方法时,参数就是配置文件中的Bean Id UserDao userDao= ac.getBean("userDao", UserDao.class); // 测试 System.out.println(userDao); // 关闭 ac.close(); } }