JavaEE开发之Spring框架整合1

Posted nuist__NJUPT

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaEE开发之Spring框架整合1相关的知识,希望对你有一定的参考价值。

随着时代发展,软件规模与功能都呈几何式增长,开发难度也在不断递增,该如何解决?
Spring可以简化开发,降低企业级开发的复杂性,使开发变得更简单快捷随着项目规模与功能的增长,遇到的问题就会增多,为了解决问题会引入更多的框架,这些框架如何协调工作?Spring可以框架整合,高效整合其他技术,提高企业级应用开发与运行效率,综上所述,Spring是一款非常优秀而且功能强大的框架。

目录

一、基本概念

1.1、控制反转(IOC)

1.2、Spring和IOC之间的关系

1.3、IOC容器的作用

1.4、依赖注入(DI)

二、入门案例

2.1、IOC入门案例

2.2、DI入门案例

三、bean的相关知识

3.1、bean的作用范围

3.2、bean的三种实例化方式

3.3、bean的生命周期

四、依赖注入(DI)相关知识

4.1、setter注入

4.2、构造器注入

4.3、自动装配

4.4、集合注入

五、IOC/DI配置管理第三方bean

5.1、实现c3p0管理

5.2、实现Druid管理

5.3、spring加载properties文件


一、基本概念

1.1、控制反转(IOC)

使用对象时,由主动new产生对象转换为由外部提供对象,此过程中对象创建控制权由程序转移到
外部,此思想称为控制反转。业务层要用数据层的类对象,以前是自己 new 的,现在自己不new了,交给 别人[外部] 来创建对象,别人[外部] 就反转控制了数据层对象的创建权,这种思想就是控制反转。

1.2、Spring和IOC之间的关系

Spring技术对IOC思想进行了实现,Spring提供了一个容器,称为IOC容器,用来充当IOC思想中的"外部",IOC思想中的 别人[外部] 指的就是Spring的IOC容器。

1.3、IOC容器的作用

IOC容器负责对象的创建、初始化等一系列工作,其中包含了数据层和业务层的类对象,被创建或被管理的对象在IOC容器中统称为Bean,IOC容器中放的就是一个个的Bean对象。

1.4、依赖注入(DI)

在容器中建立bean与bean之间的依赖关系的整个过程,称为依赖注入,业务层要用数据层的类对象,以前是自己 new 的现在自己不new了,靠 别人[外部其实指的就是IOC容器] 来给注入进来
这种思想就是依赖注入。需要程序员根据业务需求提前建立好关系,如业务层需要依赖数据层,service就要和dao建立依赖关系,介绍完Spring的IOC和DI的概念后,我们会发现这两个概念的最终目标就是:充分解耦,具体实现靠:使用IOC容器管理bean(IOC),在IOC容器内将有依赖关系的bean进行关系绑定(DI),最终结果为:使用对象时不仅可以直接从IOC容器中获取,并且获取到的bean已经绑定了所有的依赖关系.

二、入门案例

2.1、IOC入门案例

1)创建java的maven项目,并在pom.xml中导入spring依赖jar包,如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>java02</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.10.RELEASE</version>
        </dependency>
    </dependencies>


</project>

2)创建数据访问层(dao)和业务层(service)的接口和接口实现类,如下:

public interface BookDao 
    public void save() ;

import com.dao.BookDao;

public class BookDaoImpl implements BookDao 
    public void save() 
        System.out.println("book dao save ...");
    

public interface BookService 
    public void save() ;

import com.dao.BookDao;
import com.dao.impl.BookDaoImpl;
import com.service.BookService;

public class BookServiceImpl implements BookService 
    BookDao bookDao = new BookDaoImpl() ;
    public void save() 
        bookDao.save();
        System.out.println("book service save...");
    

3)添加spring的配置文件applicationContext.xml,在配置文件中配置bean对象,这样IOC容器就可以管理bean对象,通过bean对象实现控制反转。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--配置bean对象实现控制反转,id是bean的名称,class是表示bean的定义类型-->
    <bean id="bookDao" class="com.dao.impl.BookDaoImpl"/>
    <bean id="bookService" class="com.service.impl.BookServiceImpl"/>
</beans>

4)编写测试类实现获取IOC容器,并通过bean对象调用相应的方法。

import com.dao.BookDao;
import com.service.BookService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class app 
    public static void main(String[] args) 
        //获取IOC容器
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml") ;
        //获取bean对象,并执行相应的方法
        BookDao bookDao = (BookDao) applicationContext.getBean("bookDao");
        bookDao.save();
        System.out.println("-------------");
        BookService bookService = (BookService) applicationContext.getBean("bookService");
        bookService.save();
    

2.2、DI入门案例

1)将上述业务层的new方法删除,并提供对应的setter方法。

import com.dao.BookDao;
import com.service.BookService;

public class BookServiceImpl implements BookService 
    BookDao bookDao  ;
    public void save() 
        bookDao.save();
        System.out.println("book service save...");
    

    public void setBookDao(BookDao bookDao) 
        this.bookDao = bookDao;
    

2)在配置文件中添加依赖注入的配置。配置文件中两个bookDao的含义不同,name="bookDao"中 bookDao 的作用是让Spring的IOC容器在获取到名称后,将首字母大写,前
面加set找对应的 setBookDao() 方法进行对象注入。ref="bookDao"中 bookDao 的作用是让Spring能在IOC容器中找到id为 bookDao 的Bean对象给bookService 进行注入。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--配置bean对象实现控制反转,id是bean的名称,class是表示bean的定义类型-->
    <bean id="bookDao" class="com.dao.impl.BookDaoImpl"/>
    <bean id="bookService" class="com.service.impl.BookServiceImpl">
        <!--name对象参照ref对象-->
        <property name="bookDao" ref="bookDao"/>
    </bean>
</beans>

三、bean的相关知识

3.1、bean的作用范围

使用bean的 scope 属性可以控制bean的创建是否为单例:singleton 默认为单例,prototype 为非单例。

1)为什么bean默认为单例?
bean为单例的意思是在Spring的IOC容器中只会有该类的一个对象,bean对象只有一个就避免了对象的频繁创建与销毁,达到了bean对象的复用,性能高。
2)bean在容器中是单例的,会不会产生线程安全问题?
如果对象是有状态对象,即该对象有成员变量可以用来存储数据的,因为所有请求线程共用一个bean对象,所以会存在线程安全问题。如果对象是无状态对象,即该对象没有成员变量没有进行数据存储的,因方法中的局部变量在方法调用完成后会被销毁,所以不会存在线程安全问题。
 

关于bean的基础配置:id表示bean的唯一表示,name表示bean的别名,class表示bean的类全名,scope表示类的作用范围,包括singleton和prototype。

3.2、bean的三种实例化方式

1)构造方法实例化

直接在接口的实现类中定义一个无参构造方法,即可实现bean的实例化。

import com.dao.BookDao;

public class BookDaoImpl implements BookDao 
    public BookDaoImpl()
        System.out.println("构造方法实例化");
    
    public void save() 
        System.out.println("book dao save ...");
    

2)静态工厂实例化

第一步,创建一个接口和实现类,如下:

public interface OrderDao 
    public void save() ;

import com.dao.OrderDao;

public class OrderDaoImpl implements OrderDao 
    public void save() 
        System.out.println("oderDao save ...");
    

第二步,创建一个工厂类OrderDaoFactory并提供一个静态方法

import com.dao.OrderDao;
import com.dao.impl.OrderDaoImpl;

public class OrderDaoFactory 
    public static OrderDao getOrderDao()
        System.out.println("静态工厂实例化");
        return new OrderDaoImpl() ;
    


第三步,在spring的配置文件application.properties中添加以下内容:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

<!--    &lt;!&ndash;配置bean对象实现控制反转,id是bean的名称,class是表示bean的定义类型&ndash;&gt;-->
<!--    <bean id="bookDao" class="com.dao.impl.BookDaoImpl"/>-->
<!--    <bean id="bookService" class="com.service.impl.BookServiceImpl">-->
<!--        &lt;!&ndash;name对象参照ref对象&ndash;&gt;-->
<!--        <property name="bookDao" ref="bookDao"/>-->
<!--    </bean>-->

<!--    静态工厂实例配置-->
    <bean id="OrderDao" class="OrderDaoFactory" factory-method="getOrderDao"></bean>
</beans>

第四步,编写运行类,使用从IOC容器中获取bean的方法进行运行测试

import com.dao.OrderDao;
import com.service.BookService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class app 
    public static void main(String[] args) 
        //获取IOC容器
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml") ;
//        //获取bean对象,并执行相应的方法
//        BookDao bookDao = (BookDao) applicationContext.getBean("bookDao");
//        bookDao.save();
//        System.out.println("-------------");
//        BookService bookService = (BookService) applicationContext.getBean("bookService");
//        bookService.save();
        OrderDao orderDao = (OrderDao) applicationContext.getBean("OrderDao");
        orderDao.save();
    

3)实例工厂实例化

第一步,创建一个接口和一个实现类,如下:

public interface UserDao 
    public void save() ;

import com.dao.UserDao;

public class UserDaoImpl implements UserDao 
    public void save() 
        System.out.println("userDao save ...");
    

第二步,创建工厂类,并提供实例方法,如下:

import com.dao.UserDao;
import com.dao.impl.UserDaoImpl;

public class UserDaoFactory 
    public UserDao getUserDao()
        return new UserDaoImpl() ;
    

第三,在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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

<!--    &lt;!&ndash;配置bean对象实现控制反转,id是bean的名称,class是表示bean的定义类型&ndash;&gt;-->
<!--    <bean id="bookDao" class="com.dao.impl.BookDaoImpl"/>-->
<!--    <bean id="bookService" class="com.service.impl.BookServiceImpl">-->
<!--        &lt;!&ndash;name对象参照ref对象&ndash;&gt;-->
<!--        <property name="bookDao" ref="bookDao"/>-->
<!--    </bean>-->

<!--    静态工厂实例配置-->
<!--    <bean id="OrderDao" class="OrderDaoFactory" factory-method="getOrderDao"></bean>-->
<!--    实例工厂配置-->
    <bean id="userDaoFactory" class="UserDaoFactory"/>
    <bean id="userDao" factory-bean="userDaoFactory" factory-method="getUserDao"/>
</beans>

第四步,编写测试类,获取IOC容器,并使用bean对象执行方法

import com.dao.UserDao;
import com.service.BookService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class app 
    public static void main(String[] args) 
        //获取IOC容器
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml") ;
//        //获取bean对象,并执行相应的方法
//        BookDao bookDao = (BookDao) applicationContext.getBean("bookDao");
//        bookDao.save();
//        System.out.println("-------------");
//        BookService bookService = (BookService) applicationContext.getBean("bookService");
//        bookService.save();
//        OrderDao orderDao = (OrderDao) applicationContext.getBean("OrderDao");
//        orderDao.save();
        UserDao userDao = (UserDao) applicationContext.getBean("userDao");
        userDao.save();
    

3.3、bean的生命周期

关于Spring中对bean生命周期控制提供了两种方式:
在配置文件中的bean标签中添加 init-method 和 destroy-method 属性
类实现 InitializingBean 与 DisposableBean 接口,这种方式了解下即可

下面演示在配置文件中配置去控制bean的生命周期,如下:
第一步,创建接口和实现方法,如下:

public interface BookDao 
    public void save() ;
    public void init() ;
    public void destroy() ;

import com.dao.BookDao;

public class BookDaoImpl implements BookDao 

    public void save() 
        System.out.println("book dao save ...");
    
    //bean初始化对应的操作
    public void init()
        System.out.println("bean 初始化...");
    
    //bean销毁前的操作
    public void destroy()
        System.out.println("bean 销毁...");
    

第二步,在spring的配置文件中配置bean的初始化方法和销毁方法。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

<!--    &lt;!&ndash;配置bean对象实现控制反转,id是bean的名称,class是表示bean的定义类型&ndash;&gt;-->
   <bean id="bookDao" class="com.dao.impl.BookDaoImpl" init-method="init" destroy-method="destroy"/>
<!--    <bean id="bookService" class="com.service.impl.BookServiceImpl">-->
<!--        &lt;!&ndash;name对象参照ref对象&ndash;&gt;-->
<!--        <property name="bookDao" ref="bookDao"/>-->
<!--    </bean>-->

<!--    静态工厂实例配置-->
<!--    <bean id="OrderDao" class="OrderDaoFactory" factory-method="getOrderDao"></bean>-->
<!--    实例工厂配置-->
<!--    <bean id="userDaoFactory" class="UserDaoFactory"/>-->
<!--    <bean id="userDao" factory-bean="userDaoFactory" factory-method="getUserDao"/>-->
</beans>

第三步,编写测试类,获取IOC容器,根据bean对象执行相应的方法。

import com.dao.BookDao;
import com.dao.OrderDao;
import com.dao.UserDao;
import com.service.BookService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class app 
    public static void main(String[] args) 
        //获取IOC容器
        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml") ;
//        //获取bean对象,并执行相应的方法
        BookDao bookDao = (BookDao) applicationContext.getBean("bookDao");
        bookDao.save();
        applicationContext.close();
//        System.out.println("-------------");
//        BookService bookService = (BookService) applicationContext.getBean("bookService");
//        bookService.save();
//        OrderDao orderDao = (OrderDao) applicationContext.getBean("OrderDao");
//        orderDao.save();
//        UserDao userDao = (UserDao) applicationContext.getBean("userDao");
//        userDao.save();
    

四、依赖注入(DI)相关知识

4.1、setter注入

1)需要定义两个接口和接口的实现类(略),在业务层使用setter方法进行注入,可以同时注入多个,如下:

import com.dao.BookDao;
import com.dao.UserDao;
import com.service.BookService;

public class BookServiceImpl implements BookService 
    BookDao bookDao  ;
    UserDao userDao ;
    public void save() 
        bookDao.save();
        userDao.save();
        System.out.println("book service save...");
    

    public void setBookDao(BookDao bookDao) 
        this.bookDao = bookDao;
    

    public void setUserDao(UserDao userDao) 
        this.userDao = userDao;
    

2)在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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

<!--    &lt;!&ndash;配置bean对象实现控制反转,id是bean的名称,class是表示bean的定义类型&ndash;&gt;-->
<!--   <bean id="bookDao" class="com.dao.impl.BookDaoImpl" init-method="init" destroy-method="destroy"/>-->
<!--    <bean id="bookService" class="com.service.impl.BookServiceImpl">-->
<!--        &lt;!&ndash;name对象参照ref对象&ndash;&gt;-->
<!--        <property name="bookDao" ref="bookDao"/>-->
<!--    </bean>-->

<!--    静态工厂实例配置-->
<!--    <bean id="OrderDao" class="OrderDaoFactory" factory-method="getOrderDao"></bean>-->
<!--    实例工厂配置-->
<!--    <bean id="userDaoFactory" class="UserDaoFactory"/>-->
<!--    <bean id="userDao" factory-bean="userDaoFactory" factory-method="getUserDao"/>-->
   <bean id="bookDao" class="com.dao.impl.BookDaoImpl">
      <property name="database" value="mysql"/>
      <property name="connectionNum" value="10"/>
   </bean>
   <bean id="userDao" class="com.dao.impl.UserDaoImpl"/>
   <bean id="bookService" class="com.service.impl.BookServiceImpl">
      <property name="bookDao" ref="bookDao"/>
      <property name="userDao" ref="userDao"/>
   </bean>
   
</beans>

3)编写测试类,获得IOC容器,通过bean实现方法。

import com.service.BookService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class app 
    public static void main(String[] args) 
        //获取IOC容器
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml") ;
//        //获取bean对象,并执行相应的方法
        BookService bookService = (BookService) applicationContext.getBean("bookService");
        bookService.save();
//        applicationContext.close();
//        System.out.println("-------------");
//        BookService bookService = (BookService) applicationContext.getBean("bookService");
//        bookService.save();
//        OrderDao orderDao = (OrderDao) applicationContext.getBean("OrderDao");
//        orderDao.save();
//        UserDao userDao = (UserDao) applicationContext.getBean("userDao");
//        userDao.save();
    

4.2、构造器注入

1)创建接口和实现类,如下:

public interface BookDao 
    public void save() ;
import com.dao.BookDao;

public class BookDaoImpl implements BookDao 
    private String database ;
    private int connectionNum ;

    public BookDaoImpl(String database, int connectionNum) 
        this.database = database;
        this.connectionNum = connectionNum;
    

    public void save() 
        System.out.println("book dao save ...");
        System.out.println(database + "  " + connectionNum);
    


public interface UserDao 
    public void save() ;

import com.dao.UserDao;

public class UserDaoImpl implements UserDao 
    public void save() 
        System.out.println("userDao save ...");
    



2)在业务层,进行构造器注入,如下:

public interface BookService 
    public void save() ;

import com.dao.BookDao;
import com.dao.UserDao;
import com.service.BookService;

public class BookServiceImpl implements BookService 
    BookDao bookDao  ;
    UserDao userDao ;

    public BookServiceImpl(BookDao bookDao, UserDao userDao) 
        this.bookDao = bookDao;
        this.userDao = userDao;
    

    public void save() 
        bookDao.save();
        userDao.save();
        System.out.println("book service save...");
    


3)配置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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

<!--    &lt;!&ndash;配置bean对象实现控制反转,id是bean的名称,class是表示bean的定义类型&ndash;&gt;-->
<!--   <bean id="bookDao" class="com.dao.impl.BookDaoImpl" init-method="init" destroy-method="destroy"/>-->
<!--    <bean id="bookService" class="com.service.impl.BookServiceImpl">-->
<!--        &lt;!&ndash;name对象参照ref对象&ndash;&gt;-->
<!--        <property name="bookDao" ref="bookDao"/>-->
<!--    </bean>-->

<!--    静态工厂实例配置-->
<!--    <bean id="OrderDao" class="OrderDaoFactory" factory-method="getOrderDao"></bean>-->
<!--    实例工厂配置-->
<!--    <bean id="userDaoFactory" class="UserDaoFactory"/>-->
<!--    <bean id="userDao" factory-bean="userDaoFactory" factory-method="getUserDao"/>-->
   <bean id="bookDao" class="com.dao.impl.BookDaoImpl">
      <constructor-arg name="database" value="mysql"/>
      <constructor-arg name="connectionNum" value="100"/>
   </bean>
   <bean id="userDao" class="com.dao.impl.UserDaoImpl"/>
   <bean id="bookService" class="com.service.impl.BookServiceImpl">
      <constructor-arg name="bookDao" ref="bookDao"/>
      <constructor-arg name="userDao" ref="userDao"/>
   </bean>

</beans>

4)编写测试方法,获取IOC,通过bean对象进行方法测试。

import com.service.BookService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class app 
    public static void main(String[] args) 
        //获取IOC容器
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml") ;
//        //获取bean对象,并执行相应的方法
        BookService bookService = (BookService) applicationContext.getBean("bookService");
        bookService.save();
//        applicationContext.close();
//        System.out.println("-------------");
//        BookService bookService = (BookService) applicationContext.getBean("bookService");
//        bookService.save();
//        OrderDao orderDao = (OrderDao) applicationContext.getBean("OrderDao");
//        orderDao.save();
//        UserDao userDao = (UserDao) applicationContext.getBean("userDao");
//        userDao.save();
    

4.3、自动装配

1. 自动装配用于引用类型依赖注入,不能对简单类型进行操作。
2. 使用按类型装配时(byType)必须保障容器中相同类型的bean唯一,推荐使用。
3. 使用按名称装配时(byName)必须保障容器中具有指定名称的bean,因变量名与配置耦合,不推荐使用。
4. 自动装配优先级低于setter注入与构造器注入,同时出现时自动装配配置失效。

1)使用setter方法进行注入,可以使用自动装配,setter方法注入如下:

import com.dao.BookDao;
import com.dao.UserDao;
import com.service.BookService;

public class BookServiceImpl implements BookService 
    BookDao bookDao  ;
    UserDao userDao ;

    public void setBookDao(BookDao bookDao) 
        this.bookDao = bookDao;
    

    public void setUserDao(UserDao userDao) 
        this.userDao = userDao;
    

    public void save() 
        bookDao.save();
        userDao.save();
        System.out.println("book service save...");
    


2)在配置文件中加上autowire=byType可以实现按照类型进行装配。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

<!--    &lt;!&ndash;配置bean对象实现控制反转,id是bean的名称,class是表示bean的定义类型&ndash;&gt;-->
<!--   <bean id="bookDao" class="com.dao.impl.BookDaoImpl" init-method="init" destroy-method="destroy"/>-->
<!--    <bean id="bookService" class="com.service.impl.BookServiceImpl">-->
<!--        &lt;!&ndash;name对象参照ref对象&ndash;&gt;-->
<!--        <property name="bookDao" ref="bookDao"/>-->
<!--    </bean>-->

<!--    静态工厂实例配置-->
<!--    <bean id="OrderDao" class="OrderDaoFactory" factory-method="getOrderDao"></bean>-->
<!--    实例工厂配置-->
<!--    <bean id="userDaoFactory" class="UserDaoFactory"/>-->
<!--    <bean id="userDao" factory-bean="userDaoFactory" factory-method="getUserDao"/>-->
   <bean id="bookDao" class="com.dao.impl.BookDaoImpl">
      <constructor-arg name="database" value="mysql"/>
      <constructor-arg name="connectionNum" value="100"/>
   </bean>
   <bean id="userDao" class="com.dao.impl.UserDaoImpl" />
   <bean id="bookService" class="com.service.impl.BookServiceImpl" autowire="byType">
   </bean>

</beans>

3)当然也可以将autowire=byName,按照名称进行装配。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

<!--    &lt;!&ndash;配置bean对象实现控制反转,id是bean的名称,class是表示bean的定义类型&ndash;&gt;-->
<!--   <bean id="bookDao" class="com.dao.impl.BookDaoImpl" init-method="init" destroy-method="destroy"/>-->
<!--    <bean id="bookService" class="com.service.impl.BookServiceImpl">-->
<!--        &lt;!&ndash;name对象参照ref对象&ndash;&gt;-->
<!--        <property name="bookDao" ref="bookDao"/>-->
<!--    </bean>-->

<!--    静态工厂实例配置-->
<!--    <bean id="OrderDao" class="OrderDaoFactory" factory-method="getOrderDao"></bean>-->
<!--    实例工厂配置-->
<!--    <bean id="userDaoFactory" class="UserDaoFactory"/>-->
<!--    <bean id="userDao" factory-bean="userDaoFactory" factory-method="getUserDao"/>-->
   <bean id="bookDao" class="com.dao.impl.BookDaoImpl">
      <constructor-arg name="database" value="mysql"/>
      <constructor-arg name="connectionNum" value="100"/>
   </bean>
   <bean id="userDao" class="com.dao.impl.UserDaoImpl" />
   <bean id="bookService" class="com.service.impl.BookServiceImpl" autowire="byName">
   </bean>

</beans>

4.4、集合注入

1)定义一个接口,并定义一个接口实现类,在实现类中使用setter方法完成集合注入。


public interface BooksDao 
    public void save() ;

import java.util.*;
public class BooksDaoImpl implements BooksDao 
    private int [] array ;
    private List<String> list ;
    private Set<String> set ;
    private Map<String, String> map ;
    private Properties properties ;

    public void setArray(int[] array) 
        this.array = array;
    

    public void setList(List<String> list) 
        this.list = list;
    

    public void setSet(Set<String> set) 
        this.set = set;
    

    public void setMap(Map<String, String> map) 
        this.map = map;
    

    public void setProperties(Properties properties) 
        this.properties = properties;
    

    public void save() 
        System.out.println("book dao save ...");
        System.out.println("遍历数组" + Arrays.toString(array));
        System.out.println("遍历list" + list);
        System.out.println("遍历set" + set);
        System.out.println("遍历map" + map);
        System.out.println("遍历properties" + properties);
    

2)在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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

<!--    &lt;!&ndash;配置bean对象实现控制反转,id是bean的名称,class是表示bean的定义类型&ndash;&gt;-->
<!--   <bean id="bookDao" class="com.dao.impl.BookDaoImpl" init-method="init" destroy-method="destroy"/>-->
<!--    <bean id="bookService" class="com.service.impl.BookServiceImpl">-->
<!--        &lt;!&ndash;name对象参照ref对象&ndash;&gt;-->
<!--        <property name="bookDao" ref="bookDao"/>-->
<!--    </bean>-->

<!--    静态工厂实例配置-->
<!--    <bean id="OrderDao" class="OrderDaoFactory" factory-method="getOrderDao"></bean>-->
<!--    实例工厂配置-->
<!--    <bean id="userDaoFactory" class="UserDaoFactory"/>-->
<!--    <bean id="userDao" factory-bean="userDaoFactory" factory-method="getUserDao"/>-->
   <bean id="bookDao" class="com.dao.impl.BookDaoImpl">
      <constructor-arg name="database" value="mysql"/>
      <constructor-arg name="connectionNum" value="100"/>
   </bean>
   <bean id="booksDao" class="com.dao.impl.BooksDaoImpl">
      <!--注入数组类型的数据-->
      <property name="array">
         <array>
            <value>10</value>
            <value>20</value>
            <value>100</value>
         </array>
      </property>
      <!--注入list类型数据-->
      <property name="list">
         <list>
            <value>baidu</value>
            <value>aili</value>
            <value>zijie</value>
         </list>
      </property>
      <!--注入set类型数据-->
      <property name="set">
         <set>
            <value>beijing</value>
            <value>nanjing</value>
            <value>shanghai</value>
         </set>
      </property>
      <!--注入map类型数据-->
      <property name="map">
         <map>
           <entry key="country" value="China"/>
            <entry key="province" value="jiangsu"/>
            <entry key="city" value="nanjing"/>
         </map>
      </property>
      <!--注入Properties类型数据-->
      <property name="properties">
         <props>
            <prop key="fruit">香蕉</prop>
            <prop key="hobby">跑步</prop>
            <prop key="running">篮球</prop>
         </props>
      </property>

   </bean>

</beans>

3)编写测试类进行测试,获取IOC容器,通过bean对象访问方法。

import com.dao.impl.BooksDao;
import com.service.BookService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class app 
    public static void main(String[] args) 
        //获取IOC容器
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml") ;
//        //获取bean对象,并执行相应的方法
        BooksDao booksDao = (BooksDao) applicationContext.getBean("booksDao");
        booksDao.save();
//        applicationContext.close();
//        System.out.println("-------------");
//        BookService bookService = (BookService) applicationContext.getBean("bookService");
//        bookService.save();
//        OrderDao orderDao = (OrderDao) applicationContext.getBean("OrderDao");
//        orderDao.save();
//        UserDao userDao = (UserDao) applicationContext.getBean("userDao");
//        userDao.save();
    

五、IOC/DI配置管理第三方bean

5.1、实现c3p0管理

1)在pom.xml文件中导入相关依赖jar包,如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>java02</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.10.RELEASE</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.mchange/c3p0 -->
        <dependency>
            <groupId>com.mchange</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.5.5</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.20</version>
        </dependency>


    </dependencies>




</project>

2)在applicationContext.xml配置文件中配置第三方bean

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

<!--    &lt;!&ndash;配置bean对象实现控制反转,id是bean的名称,class是表示bean的定义类型&ndash;&gt;-->
<!--   <bean id="bookDao" class="com.dao.impl.BookDaoImpl" init-method="init" destroy-method="destroy"/>-->
<!--    <bean id="bookService" class="com.service.impl.BookServiceImpl">-->
<!--        &lt;!&ndash;name对象参照ref对象&ndash;&gt;-->
<!--        <property name="bookDao" ref="bookDao"/>-->
<!--    </bean>-->

<!--    静态工厂实例配置-->
<!--    <bean id="OrderDao" class="OrderDaoFactory" factory-method="getOrderDao"></bean>-->
<!--    实例工厂配置-->
<!--    <bean id="userDaoFactory" class="UserDaoFactory"/>-->
<!--    <bean id="userDao" factory-bean="userDaoFactory" factory-method="getUserDao"/>-->
 <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="driverClass" value="com.mysql.jdbc.Driver"/>
    <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/sping_db"/>
    <property name="user" value="root"/>
    <property name="password" value="root"/>
 </bean>

</beans>

3)编写测试类,获取IOC容器,进行测试

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import javax.sql.DataSource;

public class app 
    public static void main(String[] args) 
        //获取IOC容器
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml") ;
//        //获取bean对象,并执行相应的方法
        DataSource dataSource = (DataSource) applicationContext.getBean("dataSource");
        System.out.println(dataSource);


    

5.2、实现Druid管理

1)在pom.xml文件中引入druid的jar包的依赖,如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>java02</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.10.RELEASE</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.16</version>
        </dependency>
    </dependencies>
    
</project>

2)在applicationContext.xml配置文件中配置第三方bean

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

<!--    &lt;!&ndash;配置bean对象实现控制反转,id是bean的名称,class是表示bean的定义类型&ndash;&gt;-->
<!--   <bean id="bookDao" class="com.dao.impl.BookDaoImpl" init-method="init" destroy-method="destroy"/>-->
<!--    <bean id="bookService" class="com.service.impl.BookServiceImpl">-->
<!--        &lt;!&ndash;name对象参照ref对象&ndash;&gt;-->
<!--        <property name="bookDao" ref="bookDao"/>-->
<!--    </bean>-->

<!--    静态工厂实例配置-->
<!--    <bean id="OrderDao" class="OrderDaoFactory" factory-method="getOrderDao"></bean>-->
<!--    实例工厂配置-->
<!--    <bean id="userDaoFactory" class="UserDaoFactory"/>-->
<!--    <bean id="userDao" factory-bean="userDaoFactory" factory-method="getUserDao"/>-->
 <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/sping_db"/>
    <property name="username" value="root"/>
    <property name="password" value="root"/>
 </bean>

</beans>

3)编写测试类测试

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import javax.sql.DataSource;

public class app 
    public static void main(String[] args) 
        //获取IOC容器
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml") ;
//        //获取bean对象,并执行相应的方法
        DataSource dataSource = (DataSource) applicationContext.getBean("dataSource");
        System.out.println(dataSource);


    

5.3、spring加载properties文件

1)resources下创建一个jdbc.properties文件,并添加对应的属性键值对

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/spring_db
jdbc.username=root
jdbc.password=root

2)开启context命名空间,加载properties配置文件,完成属性注入

<?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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
    <context:property-placeholder location="jdbc.properties"/>
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
    <property name="driverClassName" value="$jdbc.driver"/>
    <property name="url" value="$jdbc.url"/>
    <property name="username" value="$jdbc.username"/>
    <property name="password" value="$jdbc.password"/>
    </bean>
    <bean id="orderDao" class="com.dao.impl.OrderDaoImpl">
        <property name="name" value="$jdbc.username"/>
    </bean>

</beans>

以上是关于JavaEE开发之Spring框架整合1的主要内容,如果未能解决你的问题,请参考以下文章

JAVAEE框架整合技术之Spring01-IOC教程

JAVAEE框架整合技术之Spring01-IOC教程

JavaEE开发之SpringMVC框架整合1

JAVAEE框架整合技术之spring03-SpringJdbcTemplate模板技术和事务处理

JAVAEE框架整合技术之Spring02-AOP面向切面编程技术

JAVAEE框架整合技术之Spring02-AOP面向切面编程技术