spring单元测试无法注入bean_Spring

本文详细探讨了Spring框架中单元测试时遇到的Bean注入问题,从Spring的基本概念到框架模块划分,深入剖析了Spring的IOC容器实现思路,包括依赖注入的多种方式,如set注入和构造器注入,以及静态工厂和实例化工厂的使用。同时,文章还介绍了Spring环境搭建的步骤,帮助读者理解如何在实际项目中解决Bean注入问题。
摘要由CSDN通过智能技术生成

af272162a4bcc2ee23484359f80b90f7.png

Spring概念

1、非持久层框架

持久层:Mybatis|Hibernate

可以用于集成持久层框架

2、非视图层框架

视图层:SpringMvc(主流)|Steuts|Struts1(弃用)

可以用于集成视图层框架

3、基本概念

分层框架一站式:基本可以满足web项目开发需要 轻量级(配置简单-零配置开发(注解))

两大核心:

IOC(控制反转与依赖转入)、AOP(面向切面编程)-OOP(面向对象)

解耦:高内聚 低耦合 Bean实例化 注入(依赖)

Spring相关服务(功能):邮件服务(邮件发送)、事务控制(AOP)、定时任务执行(Quartz)、JMS

Spring框架模块划分

13493d195810c3b94ef2b45cb95e5e17.png
  • Spring-IOC:Beans Core Context SpEL 控制反转与依赖注入
  • Spring-AOP:Aop Aspects 面向切面
  • Spring-jdbc:持久层操作
  • Spring-Mvc:Web Servlet
  • Spring-Test:单元测试

Spring框架环境搭建

最终目标:使用Spring框架实现对象的实例化 借助控制台实现对象方法调用

1、创建Spring普通工程

使用Idea创建Mavan普通工程 quickstart

2、添加坐标

<!--
       Spring 核心坐标
    -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>4.3.9.RELEASE</version>
    </dependency>
​

3、添加Bean对象代码

package com.shsxt.service;
​
public class UserService {
​
    //private IXxService  xxService = new XxService1();
​
​
    //private XxDao xxDao=new MYsqlXxDao();
​
​
​
​
​
    public void  test(){
        System.out.println("hello Spring");
    }
}

4、配置xml文件

<?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
        https://www.springframework.org/schema/beans/spring-beans.xsd">
​
​
    <!---
       配置需要交给spring 框架实例化的对象
          id:Bean对象唯一标识
          class:Bean 对象全路径
    -->
    <bean id="userService" class="com.shsxt.service.UserService"></bean>
</beans>

5、执行测试

package com.shsxt;
​
import com.shsxt.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
​
public class Starter {
    public static void main(String[] args) {
      /*  UserService userService=new UserService();
        userService.test();*/
        ApplicationContext ac =new ClassPathXmlApplicationContext("beans.xml");
        UserService userService= (UserService) ac.getBean("userService");
        userService.test();
        UserService userService1= (UserService) ac.getBean("userService");// 单例对象
        System.out.println(userService+","+userService1);
    }
}

Spring IOC 容器实现思路分析

ApplicationContext ac =new ClassPathXmlApplicationContext("beans.xml");
UserService userService= (UserService) ac.getBean("userService");

怎么实现?

思路分析

技术点:

工厂设计模式

xml解析-dom4j

反射

单例

实现方案

1、定义工厂类-接口-SxtBeanFactory

Object getBean(String beanName);

2、定义实现类 实现SxtBeanFactory

思路:
1、文件加载
    将xml文件加载到内存
2、xml解析
    dom4j
    读取bean标签   获取id class
        内容如何存取-集合List<Map|JavaBean>   Map<id,class>
3、对象的实例化
        遍历集合  List|Map
        id-class  :反射实例化对象   -->Map<id,class>
4、返回对象
        map.get(id);

Spring IOC 核心设计模式

1、单例-懒汉 饿汉 枚举 防止反射

2、工厂设计模式(抽象工厂)

3、xml解析技术

4、反射技术

5、自定义注解

6、策略模式

Spring IOC 实例化

Spring IOC 依赖注入(DI)手动装配

set注入

Sping IOC内部通过set方法实现Bean对象注入

1、添加属性set方法

public class RoleService {
​
    private UserService userService;
​
    private AccountService at;
​
    private String roleName;
​
    private Integer age;
​
    private String host;
​
    private Integer port;
​
​
    public void setPort(Integer port) {
        this.port = port;
    }
​
    public void setHost(String host) {
        this.host = host;
    }
​
    public void setAge(Integer age) {
        this.age = age;
    }
​
    public void setRoleName(String roleName) {
        this.roleName = roleName;
    }
​
    public void setAt(AccountService at) {
        this.at = at;
    }
​
    public void setUserService(UserService userService) {
        this.userService = userService;
    }
​
    public  void test01(){
        System.out.println("roleService.test01..."+roleName+","+age+","+host+","+port);
        userService.test();
        at.test();
    }
}

2、加入Bean标签 的子标签 property

 <!---
        对象的依赖注入
            name:属性名称值
            ref:当前属性名对应的Bean 对象 目标对象的唯一标识
    -->
    <bean id="roleService" class="com.shsxt.service.RoleService">
        <property name="userService"  ref="userService"></property>
        <property name="at" ref="accountService"></property>
        <property name="roleName" value="admin"></property>
        <property name="age" value="20"></property>
        <property name="host" value="192.168.10.20"></property>
        <property name="port" value="25"></property>
    </bean>
​
    <bean id="userService" class="com.shsxt.service.UserService"></bean>
​
    <bean id="accountService" class="com.shsxt.service.AccountService"></bean>

构造器注入

1、提供带参构造方法

2、添加bean标签子标签 constructor-arg标签 name ref(同set注入)可能会出现循环引用 解决方案使用set注入

静态工厂

特点:

I、要有该工厂类及工厂方法

2、工厂方法为静态的

静态工厂定义

package com.shsxt.factory;
import com.shsxt.service.UserService;
public class StaticFactory {
  public static UserService createUserService(){
     return new UserService();
 } 
}

Bean 配置

<bean id="userService" class="com.shsxt.factory.StaticFactory" 
factory-method="createUserService"/>

当我们指定 Spring 使用静态工厂方法来创建 Bean 实例时,Spring 将先

解析配置文件,并根据配置文件指定的信息,通过反射调用静态工厂类的静态

工厂方法,并将该静态工厂方法的返回值作为 Bean 实例,在这个过程中,

Spring 不再负责创建 Bean 实例,Bean 实例是由用户提供的静态工厂方法提供

实例化工厂

相比较静态工厂实现

I、工厂方法为非静态方法

2、.需要配置工厂 bean,并在业务 bean 中配置 factory-bean,factory-method 属性

实例化工厂定义

package com.shsxt.factory;
import com.shsxt.service.UserService;
public class InstanceFactory {
  public UserService createUserService(){
     return new UserService();
  }
 }

Bean 配置

<!--
实例化工厂
1.定义实例化工厂 bean
2.引用工厂 bean 指定工厂创建方法(方法为非静态)
-->
<bean id="instanceFactory" class="com.shsxt.factory.InstanceFactory"></bean>
<bean id="userService" factory-bean="instanceFactory" factorymethod="createUserService"></bean>

spring 三种实例化 bean 的方式比较

方式一:

通过 bean 的缺省构造函数创建,当各个 bean 的业务逻辑相互比较独立的时候或者和外界关联较少的时候可以使用

方式二:

利用静态 factory 方法创建,可以统一管理各个 bean 的创建,如各个 bean在创建之前需要相同的初始化处理,则可用这个 factory 方法险进行统一的处理等等

方式三:

利用实例化 factory 方法创建,即将 factory 方法也作为了业务 bean 来控制,

1 可用于集成其他框架的 bean 创建管理方法,

2 能够使 bean 和 factory 的角色互换

开发中项目一般使用一种方式实例化 bean,项目开发基本采用第一种方式,交

给 spring 托管,使用时直接拿来使用即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值