1.spring创建对象的三种方式

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 ProjectGroup 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();
  }
​
}

猜你喜欢

转载自www.cnblogs.com/caoxingchun/p/12716991.html
今日推荐