【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();
    }
}
相关推荐
陌上花开࿈1 小时前
调用第三方接口
java
Aileen_0v01 小时前
【玩转OCR | 腾讯云智能结构化OCR在图像增强与发票识别中的应用实践】
android·java·人工智能·云计算·ocr·腾讯云·玩转腾讯云ocr
桂月二二3 小时前
Java与容器化:如何使用Docker和Kubernetes优化Java应用的部署
java·docker·kubernetes
liuxin334455663 小时前
学籍管理系统:实现教育管理现代化
java·开发语言·前端·数据库·安全
小马爱打代码4 小时前
设计模式详解(建造者模式)
java·设计模式·建造者模式
栗子~~4 小时前
idea 8年使用整理
java·ide·intellij-idea
2301_801483694 小时前
Maven核心概念
java·maven
Q_19284999065 小时前
基于Spring Boot的电影售票系统
java·spring boot·后端
我要学编程(ಥ_ಥ)5 小时前
初始JavaEE篇 —— 网络原理---传输层协议:深入理解UDP/TCP
java·网络·tcp/ip·udp·java-ee
就爱学编程5 小时前
重生之我在异世界学编程之C语言:数据在内存中的存储篇(下)
java·服务器·c语言