【Spring】基于xml文件和注解方式的自动装配

自动装配:根据指定的策略,在IOC容器中匹配某个bean,自动为bean中的类类型属性或接口类型的属性赋值,可以通过bean标签中的autowire属性设置自动装配的策略。

一、基于xml文件

一个类型的bean在IOC容器中只出现一次,默认就是单例的,如果要通过配置多个类型的多个bean来获得不同的对象没有太大的必要,只需要在bean里面里面设置一个作用域,把单例设置成多例就可以获得。

基于xml文件的自动装配有以下几种方式:

aytowire属性有no、default、byName、byType四种策略

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

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

XML 复制代码
    <bean id="userController" class="com.zh.spring.controller.UserController" autowire="byType">
<!--        <property name="userService" ref="userService"></property>-->
    </bean>

注意:

  • 若通过类型没有找到任何一个类型匹配的bean,此时不装配,属性使用默认值
  • 若通过类型找到了多个类型匹配的bean,此时会抛出异常:NoUniqueDefinitionException

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

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

XML 复制代码
<bean id="userService" class="com.zh.spring.service.impl.UserServiceImpl" autowire="byName" >
<!--        <property name="userDao" ref="userDao"></property>-->
    </bean>
java 复制代码
    @Test
    public void testAutowire(){
        ApplicationContext ioc = new ClassPathXmlApplicationContext("spring-autowire-xml.xml");
        UserController userController = ioc.getBean(UserController.class);
        userController.saveUser();
    }

总结:当类型匹配的bean有多个类型时,此时可以使用byName实现自动装配。
byType不行时(即根据类型匹配到多个类型的bean)才使用byName。

二、基于注解的自动装配

基本使用的是基于注解的自动装配管理bean

和xml配置一样,注解本身并不能执行,注解本身仅仅是一个标记,具体的功能是框架检测到注解标记的位置,然后针对这个位置按照注解标记的功能来执行具体操作。

Spring为了知道开发人员在何处加了什么标记会进行扫描。

标识组件的常用注解:

  1. @Component:将类标识为普通组件
  2. @Controller:将类标识为控制层组件
  3. @Service:将类标识为服务层组件
  4. @Repository:将类标识为持久层组件
    注意:这些组件不能加在接口上,只能加在普通的类以及实现类上,不能胡乱标记,要根据是否是控制层、服务层、持久层来标记,如果都不是,则标记为@Component

1.扫描组件

注解+扫描:可以将所扫描的包下的 加上注解的这些类 作为组件进行管理,就是在IOC容器中有了当前类加上注解所对应的bean对象。

use-default-filter="true"(默认),所设置的包下所有的类都需要扫描,此时可以使用排除扫描

use-default-filter="false",所设置的包下所有的类都不需要扫描,此时可以使用包含扫描

排除扫描:context:exclude-filter

包含扫描:context-include-filter

XML 复制代码
 <context:component-scan base-package="com.zh.spring" use-default-filters="true">
<!--        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>-->
<!--        <context:exclude-filter type="assignable" expression="com.zh.spring.controller.UserController"/>-->
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

注意:排除和包含不能同时使用,一般排除用的多。

2.bean的id的表示方式

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

java 复制代码
 @Test
    public void test(){

        ApplicationContext ioc = new ClassPathXmlApplicationContext("spring-ioc-annotation.xml");
        UserService userService = ioc.getBean("userServiceImpl",UserService.class);
        System.out.println(userService);
        UserDao userdao = ioc.getBean("userDaoImpl",UserDao.class);
        System.out.println(userdao);
        UserController userController = ioc.getBean(UserController.class);
//        System.out.println(userController);
        userController.saveUser();
    }

b.设置自定义id,通过在类名上的注解的括号中的value值表示

java 复制代码
@Controller("controller")  //自定义id  value属性值

public class UserController {

}

3.添加@Autowired注解进行赋值

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

@Autowired能够标识的位置:

  1. 标识在成员变量上,此时不需要设置成员变量的set方法
  2. 标识在set方法上
  3. 为当前成员变量赋值的有参构造函数上
java 复制代码
@Controller
public class UserController {

    //控制层访问这个对象
    //在成员变量上标记
//    @Autowired
    private UserService userService;

    //在有参构造方法上标记
    @Autowired
    public UserController(UserService userService) {
        this.userService = userService;
    }

    //在set方法上标记
        @Autowired
    public void setUserService(UserService userService) {
        this.userService = userService;
    }

    public void saveUser(){
       userService.saveUser();
    }
}
相关推荐
·薯条大王7 小时前
经济实惠玩云服务器|一台云服务器多人共用,子账号配置教程
java·linux·运维·服务器·汇编·c++·python
ZJH__GO10 小时前
网络编程v4pro--实现聊天室文件传输功能
java·服务器·网络·计算机网络
程序员黑豆11 小时前
Windows 系统 Java 环境变量配置全攻略:解决“不是内部或外部命令”
java·前端·ai编程
命运之光11 小时前
【C语言完整代码】就诊信息管理系统
java·c语言·开发语言
凤山老林11 小时前
Spring Boot @Async 线上实战:从默认配置到生产级线程池治理
java·spring boot·后端
marvelyu12 小时前
每天10分钟学会OceanBase系列(Day 20):跨机房容灾实战——构建多数据中心高可用架构
java·大数据·数据库
AI人工智能+电脑小能手13 小时前
大白话说Java设计模式-04-工厂方法模式(业务实战篇)
java·设计模式·工厂方法模式·架构设计·代码解耦
BUG指挥官13 小时前
Sa-Token和Spring Security对比
java·后端·spring
小当家.10513 小时前
深入理解 ReAct Agent:从原理到 Java 实战
java·react.js·agent·react·架构设计·agent设计
geminigoth13 小时前
Spring AI Alibaba 入门开发一(备份)
java·人工智能·spring