KKB :Spring IOC如何优化原代码(指的是service-dao-bean模式)、使用bean创建对象的几种方式(详细)

使用spring框架的过程

1、导入依赖

 <!-- Spring的核心工具包-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>5.0.8.RELEASE</version>
        </dependency>
        <!--在基础IOC功能上提供扩展服务,还提供许多企业级服务的支持,有邮件服务、 任务调度、远程访问、缓存以及多种视图层框架的支持-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.0.8.RELEASE</version>
        </dependency>
        <!-- Spring IOC的基础实现,包含访问配置文件、创建和管理bean等 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>5.0.8.RELEASE</version>
        </dependency>
        <!-- Spring context的扩展支持,用于MVC方面 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>5.0.8.RELEASE</version>
        </dependency>
        <!-- Spring表达式语言 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-expression</artifactId>
            <version>5.0.8.RELEASE</version>
        </dependency>

2、配置xml文件

beans表示的是多个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">


</beans>

声明格式:

<bean id="对象名" class="类的完整路径"> 
    <property name="属性名" ref="对象的id值"></property> 
</bean>

实战演示:

     <!--IOC统一管理、统一分配-->
    <bean id="daoImpl" class="com.xzk.dao.impl.UserDaoImpl"></bean>

    <bean id="serviceImpl" class="com.xzk.service.impl.UserServiceImpl">
        <property name="dao" ref="daoImpl"></property>
    </bean>

批注:

     上面代码中property的内容是怎么来的?

      因为在serviceImpl中我们都知道,service是调用dao的,所谓的调用就是在service类中new了一个dao对象,或者说创建了一个dao对象。

      我们在配置文件中配置的bean,如果没有property,表示的只是将对象的管理交给了IOC容器,现在IOC容器的功能,如果说没有property的功能是只具备创建对象的功能,而且是调用对象的无参构造方法

      我们的service层需要的功能是在一个service类中创建一个dao的对象,有点类似于嵌套的关系。为了表示一种依赖的关系,我们就在bean中指定property表示另外一个对象,ref 指的是另外一个bean对象

      达到在一个对象中调用另外一个对象的需求

当容器给属性赋值时,默认调取 set方法,意思说在创建属性时,如果是私有属性,我们就需要给属性一个set方法

3、配置文件写好之后,如何获取需要的对象

        //加载配置文件
        ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
        //通过getBean(“对象的ID”)这个方法得到指定的对象
        UserServiceImpl serviceImpl = (UserServiceImpl) context.getBean("serviceImpl");
        serviceImpl.insertUser1(new User());

bean标签创建对象是调用对象的构造方法进行创建的

注意,这里的构造方法可以是无参构造,也可以是有参构造方法,无参构造我们不需要指定参数,使用上面的方法就可以了

问题深入:bean标签中如何调用有参构造方法

调用有参构造,我们就需要在bean标签中加上参数

比如我们的bean对象User,有两个参数,并创建出全参的构造方法,我们在bean中应该如何配置才能使用呢?

constructor-arg 参数使用index指定下标,使用value值指定参数的值

 <bean id="u2" class="com.xzk.bean.User">
        <constructor-arg index="0" value="zaSan"></constructor-arg>
        <constructor-arg index="1" value="17"></constructor-arg>
 </bean>

问题延伸:bean标签中如何调取静态方法

比如User对象里包括一个获取学生类的静态方法

XML中的bean对象如何配置呢?

这里使用的是静态工厂模式

factory-method 指定类中的静态方法

<bean id="u3" class="com.xzk.bean.User" factory-method="getStudent"></bean>

问题延伸:bean标签中如何调取非静态方法

<bean id="u4" class="com.xzk.bean.User"></bean>
<bean id="u5" factory-bean="u4" factory-method="getStudent2"></bean>

我们在获取的时候,获取的是 u5 

总结:

我们使用bean创建对象的几种方式

  1. 无参构造
  2. 有参构造
  3. 静态方法
  4. 非静态方法

猜你喜欢

转载自blog.csdn.net/awodwde/article/details/112771853