【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();
    }
}
相关推荐
zaim11 小时前
计算机的错误计算(一百一十四)
java·c++·python·rust·go·c·多项式
hong_zc2 小时前
算法【Java】—— 二叉树的深搜
java·算法
进击的女IT3 小时前
SpringBoot上传图片实现本地存储以及实现直接上传阿里云OSS
java·spring boot·后端
Miqiuha3 小时前
lock_guard和unique_lock学习总结
java·数据库·学习
杨半仙儿还未成仙儿4 小时前
Spring框架:Spring Core、Spring AOP、Spring MVC、Spring Boot、Spring Cloud等组件的基本原理及使用
spring boot·spring·mvc
一 乐4 小时前
学籍管理平台|在线学籍管理平台系统|基于Springboot+VUE的在线学籍管理平台系统设计与实现(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·学习
数云界4 小时前
如何在 DAX 中计算多个周期的移动平均线
java·服务器·前端
阑梦清川4 小时前
Java继承、final/protected说明、super/this辨析
java·开发语言
快乐就好ya6 小时前
Java多线程
java·开发语言
IT学长编程6 小时前
计算机毕业设计 二手图书交易系统的设计与实现 Java实战项目 附源码+文档+视频讲解
java·spring boot·毕业设计·课程设计·毕业论文·计算机毕业设计选题·二手图书交易系统