我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Spring框架基于xml实现自动装配流程详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Spring框架基于xml实现自动装配流程详解

一、基于xml的自动装配之场景模拟:

自动装配:

根据指定的策略,在IOC容器中匹配某一个bean,自动为指定的bean中所依赖的类类型或接口类 型属性赋值

场景模拟

①创建类UserController

public class UserController {
    private UserService userService;
    public UserService getUserService() {
        return userService;
    }
    public void setUserService(UserService userService) {
        this.userService = userService;
    }
    public void saveUser() {
        userService.saveUser();
    }
}

创建接口UserService

public interface UserService {
    
    void saveUser();
}

创建类UserServiceImpl实现接口UserService

public class UserServiceImpl implements UserService {
    private UserDao userDao;
    public UserDao getUserDao() {
        return userDao;
    }
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
    @Override
    public void saveUser() {
        System.out.println("保存成功");
    }
}

创建接口UserDao

public interface UserDao {
    
    void saveUser();
}

创建类UserDaoImpl实现接口UserDao

public class UserDaoImpl implements UserDao {
    @Override
    public void saveUser() {
        System.out.println("保存成功");
    }
}

②配置bean

    <bean id="userController" class="com.tian.spring.controller.UserController">
        <property name="userService" ref="userService"></property>
    </bean>
    <bean id="userService" class="com.tian.spring.service.impl.UserServiceImpl">
        <property name="userDao" ref="userDao"></property>
    </bean>
    <bean id="userDao" class="com.tian.spring.dao.impl.UserDaoImpl"></bean>

③测试类:

public class AutowireByXMLTest {
    @Test
    public void testAutowire() {
        ApplicationContext ioc = new ClassPathXmlApplicationContext("spring-autowire-xml.xml");
        UserController userController = ioc.getBean(UserController.class);
        userController.saveUser();
    }
}

结果:

保存成功

二、基于xml的自动装配之byType

可以通过bean标签中的autowire属性设置自动装配的策略

自动装配的策略:

1.no,default:表示不装配,即bean中的属性不会自动匹配某个bean为属性赋值,此时属性使用默认值

2.byType:根据要赋值的属性的类型,在IOC容器中匹配某个bean,为属性赋值

注意:

(一些用byType进行自动装配的问题,当然不容易见到,这里我也不去演示,知道就可以):

a>若通过类型没有找到任何一个类型匹配的bean,此时不装配,属性使用默认值

b>若通过类型找到了多个类型匹配的bean,此时会抛出异常:NoUniqueBeanDefinitionException

总结:

当使用byType实现自动装配时,IOC容器中有且只有一个类型匹配的bean能够为属性赋值

3.byName:将要赋值的属性的属性名作为bean的id在IOC容器中匹配某个bean,为属性赋值

总结:

当类型匹配的bean有多个时,此时可以使用byName实现自动装配

配置bean

    <bean id="userController" class="com.tian.spring.controller.UserController" autowire="byType">
<!--        <property name="userService" ref="userService"></property>-->
    </bean>
    <bean id="userService" class="com.tian.spring.service.impl.UserServiceImpl" autowire="byType">
<!--        <property name="userDao" ref="userDao"></property>-->
    </bean>
    <bean id="userDao" class="com.tian.spring.dao.impl.UserDaoImpl"></bean>

经过测试发现也是可以进行输出的

保存成功

三、基于xml的自动装配之byName

    <bean id="userController" class="com.tian.spring.controller.UserController" autowire="byName">
<!--        <property name="userService" ref="userService"></property>-->
    </bean>
    <bean id="userService" class="com.tian.spring.service.impl.UserServiceImpl" autowire="byName">
<!--        <property name="userDao" ref="userDao"></property>-->
    </bean>
    <bean id="service" class="com.tian.spring.service.impl.UserServiceImpl" autowire="byName">
        <!--        <property name="userDao" ref="userDao"></property>-->
    </bean>
    <bean id="userDao" class="com.tian.spring.dao.impl.UserDaoImpl"></bean>
    <bean id="dao" class="com.tian.spring.dao.impl.UserDaoImpl"></bean>

经过测试发现也是可以进行输出的

保存成功

四、基于注解管理bean之功能分析

@Component:将类标识为普通组件

@Controller:将类标识为控制层组件

@Service:将类标 识为业务层组件

@Repository:将类标识为持久层组件

通过注解+扫描所配置的bean的id,默认值为类的小驼峰,即类的首字母为小写的结果

可以通过标识组件的注解的value属性值设置bean的自定义的id

①创建maven工程,并引入相关依赖

    <dependencies>
        <!-- 基于Maven依赖传递性,导入spring-context依赖即可导入当前所需所有jar包 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.23</version>
        </dependency>
        <!-- junit测试 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

②创建组件

创建控制层

@Controller("controller")
public class UserController {
}

创建业务层

UserService接口

@Repository
public interface UserDao {
}

UserServiceImpl实现类 

public class UserDaoImpl implements UserDao {
}

创建持久层

UserDao接口

public interface UserDao {
}

UserDaoImpl实现类 

@Repository
public class UserDaoImpl implements UserDao {
}

③创建配置文件spring-ioc-annotation.xml

<context:component-scan base-package="com.tian.spring"></context:component-scan>

测试类:

public class IOCByAnnotationTest {
    @Test
    public void test() {
        ApplicationContext ioc = new ClassPathXmlApplicationContext("spring-ioc-annotation.xml");
        UserController userController = ioc.getBean("controller" ,UserController.class);
        System.out.println(userController);
        UserService userService = ioc.getBean("userServiceImpl",UserService.class);
        System.out.println(userService);
        UserDao userDao = ioc.getBean("userDaoImpl",UserDao.class);
        System.out.println(userDao);
    }
}

五、基于注解管理bean之扫描组件

context:exclude-filter:排除扫描

type:设置排除扫描的方式 type="annotation/assignable" annotation:根据注解的类型进行排除,expression需要设置排除的注解的全类名 assignable:根据类的类型进行排除,expression需要设置排除的类的全类名

context:include-filter:包含扫描

注意:需要在context:component-scan标签中设置use-default-filters="false" use-default-filters="true"(默认),所设置的包下所有的类都需要扫描,此时可以使用排除扫描 use-default-filters="false",所设置的包下所有的类都不需要扫描,此时可以使用包含扫描

情况一,最基本的扫描方式:

<context:component-scan base-package="com.tian.spring"></context:component-scan>

情况二:指定要排除的组件

<context:component-scan base-package="com.tian.spring" use-default-filters="false">
    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

情况三:仅扫描指定组件

    <context:component-scan base-package="com.tian.spring" use-default-filters="false">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

六、基于注解的自动装配之@Autowired注解能够标识的位置及其原理和注意事项

@Autowired:实现自动装配功能的注解

1)@Autowired注解能够标识的位置

a>标识在成员变量上,此时不需要设置成员变量的set方法

b>标识在set方法上

c>为当前成员变量赋值的有参构造上

2)@Autowired注解的原理

a>默认通过byType的方式,在IOC容器中通过类型匹配某个bean为属性赋值

b>若有多个类型匹配的bean,此时会自动转换为byName的方式实现自动装配的效果

即将要赋值的属性的属性名作为bean的id匹配某个bean为属性赋值

c>若byType和byName的方式都无法实现自动装配,即IOC容器中有多个类型匹配的bean

且这些bean的id和要赋值的属性的属性名都不一致,此时抛异常:NoUniqueBeanDefinitionException

d>此时可以在要赋值的属性上,添加注解@Qualifier

通过该注解的value属性值,指定某个bean的id,将这个bean为属性赋值

3)注意:

若IOC容器中没有任何一个类型匹配的bean,此时抛出异常NoSuchBeanDefinitionException

在@Autowired注解中有个属性required,默认值为true,要求必须完成自动装配

可以将required设置为false,此时能装配则装配,无法装配则使用属性的默认值

(由于一个类型的bean不可能在IOC容器中配置多次,所以这种情况一般不会出现)

1)@Autowired:实现自动装配功能的注解

方式一:

    @Autowired
    private UserService userService;

方式二:

    @Autowired
    public void setUserService(UserService userService) {
        this.userService = userService;
    }

方式三:

    @Autowired
    public UserController(UserService userService) {
        this.userService = userService;
    }

到此这篇关于Spring框架基于xml实现自动装配流程详解的文章就介绍到这了,更多相关Spring自动装配内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Spring框架基于xml实现自动装配流程详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Spring框架基于xml实现自动装配流程详解

自动装配就是指 Spring 容器在不使用 <constructor-arg> 和<property> 标签的情况下,可以自动装配(autowire)相互协作的 Bean 之间的关联关系,将一个 Bean 注入其他 Bean 的 Property 中
2022-11-13

Spring基于xml实现自动装配流程详解

自动装配是使用spring满足bean依赖的一种方法,spring会在应用上下文中为某个bean寻找其依赖的bean,Spring中bean有三种装配机制,分别是:在xml中显式配置、在java中显式配置、隐式的bean发现机制和自动装配
2023-01-03

SpringCloudGateway自动装配实现流程详解

SpringCloudGateway旨在为微服务架构提供一种简单有效的、统一的API路由管理方式。SpringCloudGateway作为SpringCloud生态系中的网关,它不仅提供统一的路由方式,并且基于Filter链的方式提供了网关基本的功能,例如:安全、监控/埋点和限流等
2022-11-13

详解Spring框架之基于Restful风格实现的SpringMVC

如果说现在你要做一个系统,假设说有一个模块属于公告管理,那么我们可能安排路径的时候会这样安排NewsAction路径: 增加新闻:/pages/back/admin/news/add.action; 新闻列表:/pages/back/adm
2023-05-31

Spring基于Aop实现事务管理流程详细讲解

这篇文章主要介绍了Spring基于Aop实现事务管理流程,事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性,感兴趣想要详细了解可以参考下文
2023-05-20

Spring框架基于注解的AOP之各种通知的使用与环绕通知实现详解

这篇文章主要介绍了Spring框架基于注解的AOP之各种通知的使用及其环绕通知,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
2022-11-13

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录