• 面试官:小伙子,讲一下spring依赖注入吧!网友:就这,就这啊。。。


    前言

    • 依赖注入DI(Dependency Injection)的三种注入方法使用介绍
    • set方法
    • 构造方法
    • 注解法

    使用set方法注入

    如下图中UseService文件依赖Userdao对象,可以通过setUserDao11函数设置注入

    配置文件使用property标签配置注入内容
    注意:配置文件中name参数的值取至set方法后跟的内容同时首字母小写
    例如:set方法名是setUserDao111,那么name的值就是userDao111。

    使用有参构造函数注入

    有参构造函数注入使用constructor-arg标签name是要注入的构造函数的参数名

    如果注入的内容是引用类型,就使用‘ref=’给对象赋值,且对象的值必须是在配置文件中注册过的的对象id,如本文中的userServiceId和userDaoId,如果注入内容是普通数据类型,就使用‘value=’赋值,赋的值可以是任意值,无需提前注册。

    使用注解

    使用注解方法时不需要在配置文件中添加各个要注入的内容,而是在配置文件中配置组件扫描即可,源文件也不在需要定义set方法,构造方法。

    在配置文件中添加如下语句,即可让spring扫描com.syx.dao包下的所有注解,否则spring无法识别你注解的内容

    <context:component-scan base-package="com.syx.dao"></context:component-scan>
    
    

    具体注解方法如下:

    // 使用Component添加id为userServiceId的注解相当于配置文件执行了
    // <bean id="userServiceId" class="com.syx.dao.service.UserService"/>
    @Component("userServiceId")
    public class UserService {
    	// Autowired和Qualifier组合作用是按照名称进行注入,使用相当于
    	// <constructor-arg name="userdaoparam" ref="userDaoId"></constructor-arg>
        @Autowired
        @Qualifier("userDaoId")
        private UserDao userdaoparam;
    
    	// Value是按照值进行注入,相当于
    	// <property name="test_a" value="13"></property>
    	// 注解中的值可以是${...}表达式
        @Value("13")
        private int test_a;
    
        public void test() {
            System.out.println("注入值是" + test_a);
            userdaoparam.test();
        }
    }
    
    

    常用配置文件注入标签使用示例

      <bean id="userServiceId" class="com.syx.dao.service.UserService">
          <property name="userDao11" ref="userDaoId"></property>
          <!-- test_a 是int类型数据注入值100 -->
          <property name="test_a" value="100"></property>
          
          
      	<!-- strList是List<String>集合,使用如下方法给集合添加两个成员aaa和bbb -->
      	<property name="strList">
      		<list>
      			<value>aaa</value>
      			<value>bbb</value>
      			<!-- 如果集合List存储的是引用类型数据 需改用ref标签赋值,如下
      			<ref bean="userDaoId"></ref>
      			-->
      		</list>
      	</property>
    
    
      	<!-- userMap是Map<String, String>类型数据 -->
      	<property name="userMap">
      		<map>
      			<entry key="adc" value="def"></entry>
      			<!-- 如果Map的键值对均为引用类型,那么要使用如下标签进行注入
      			<entry key-ref="adc" value-ref="def"></entry>
      			-->
      		</map>
      	</property>
    
      	<!-- properties是一个Properties类型数据 -->
      	<property name="properties">
      		<props>
      			<prop key="adc">123456</prop >
      			<prop key="adc">fkgj</prop >
      		</props>
      	</property>
      </bean>
    
    

    注解详解

    • @Component和@Controller、@Service、@Repository三个注解功能完全一致,只不过后三个一般分别用于web层,service层和dao层,更能起到表意作用。
    • @Autowired用于字段的依赖注入,当spring容器中只有某类的一个bean时,可以单独使用。
      @Qualifier结合@Autowired按名称给字段注入
      @Resource(name = “bean_id”)相当于@Qualifier和@Autowired(“bean_id”)配合使用
    • @Value 注入普通值属性,通常Value的值会使用${…}表达式
    • @Scope 设置bean是仅创建单个对象还是可以创建多个对象。
    • @PostConstruct设置bean的初始化方法,作用等同于配置文件中的init-methond="…"
    • @PreDestroy设置bean的销毁方法,作用等同于配置文件的destory-methond="…"

    总结

    欢迎关注公众号:前程有光,领取一线大厂Java面试题总结+各知识点学习思维导+一份300页pdf文档的Java核心知识点总结! 这些资料的内容都是面试时面试官必问的知识点,篇章包括了很多知识点,其中包括了有基础知识、Java集合、JVM、多线程并发、spring原理、微服务、Netty 与RPC 、Kafka、日记、设计模式、Java算法、数据库、Zookeeper、分布式缓存、数据结构等等。

  • 相关阅读:
    ASP.NET Page 那点事
    .Net项目分层与文件夹结构大全(最佳架子奖,吐槽奖,阴沟翻船奖揭晓)
    bash_profile和.bashrc的区别
    limits.conf生效问题
    有关snprintf返回值
    snprintf和strncpy对比
    Hadoop技术论坛
    Ubuntu系统微调
    interpreter和state模式的区别
    ANTLR实现的SQL解析器 OQL
  • 原文地址:https://www.cnblogs.com/lwh1019/p/14540111.html
Copyright © 2020-2023  润新知