【Spring框架】spring对象注入的三种方法

目录

1.属性注入

属性注⼊是使⽤ @Autowired 实现的,将 Service 类注⼊到 Controller 类中。

java 复制代码
package com.java.demo.dao;

import org.springframework.stereotype.Repository;

@Repository
public class UserRepository {
    public int add() {
        System.out.println("Do UserRepository add method.");
        return 1;
    }
}
java 复制代码
package com.java.demo.service;

import com.java.demo.dao.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    // 1. 属性注入
    @Autowired // DI(依赖注入)
    private UserRepository userRepository;

    public int add() {
        System.out.println("Do UserService add method.");
        // 传统写法
//        UserRepository userRepository = new UserRepository();
//        return userRepository.add();
        // Spring V1.0
//        ApplicationContext context =
//                new ClassPathXmlApplicationContext("spring-config.xml");
//        UserRepository userRepository = context.getBean("userRepository",UserRepository.class);
//
//        return userRepository.add();


        // Spring V2.0
        return userRepository.add();
    }
}

依赖注入 VS 依赖查找

-依赖查找依赖 Bean

-@Autowired 依赖注入流程:首先先根据getType(从容器中)获取对象,如果只获取一个,那么直接将此对象注入到当前属性上;如果获取到多个对象,才会使用getName(根据名称)进行匹配。

问题:同类型的Bean存储到容器多个,获取时报错的问题;


解决方案:

1.将属性的名字和Bean的名字对应上。


2.使用@AutoWired+@Qualifier来筛选bean对象;

属性注入优缺点

优点:使用简单。

缺点:

a)无法注入一个不可变的变量(final修饰的变量)

b)只适用于IoC容器。

c)更容易违背单一设计原则,因为使用起来比较简单。

2.Setter注入

java 复制代码
package com.java.demo.service;

import com.java.demo.dao.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserService3 {

    private UserRepository userRepository;

    @Autowired
    public void setUserRepository(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public void sayHi() {
        System.out.println("Do UserService3 sayHi.");
        userRepository.add();
    }
}

Setter注入优缺点

优点:通常Setter只set一个属性,所以Setter注入更符合单一设计原则

缺点:

a)无法注入一个final修饰的变量;

b)Setter注入的对象可以被修改。Setter本生就是一个方法,既然是一个方法就有可能被多次调用和修改。

3.构造方法注入(Spring 4.x之后推荐注入方式)

java 复制代码
package com.java.demo.service;

import com.java.demo.dao.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserService4 {
    private UserRepository userRepository;

    @Autowired
    public UserService4(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public void sayHi() {
        System.out.println("Do UserService4 sayHi.");
        userRepository.add();
    }

}

如果当前类中存在一个构造方法时,@Autowired可以省略。

构造方法注入优缺点

优点:

a)可以注入一个final修饰的变量。

b)注入的对象不会修改,因为构造方法只会加载一次。

c)构造方法注入可以保证注入对象完全初始化。

d)构造方法注入通用性更好。

缺点:

a)写法比属性注入复杂。

b)使用构造方法注入,无法解决循环依赖的问题。

相关推荐
用户830719684082几秒前
Spring Boot 多数据源与事务管理深度解析:从原理到实践
java·spring boot
Yiii_x几秒前
基于多线程机制的技术应用与性能优化
java·经验分享·笔记
uup几秒前
包装类的 “缓存陷阱”:Integer.valueOf (128) == 128 为何为 false?
java
小徐Chao努力1 分钟前
Go语言核心知识点底层原理教程【Map的底层原理】
java·golang·哈希算法
后端小张2 分钟前
【AI 学习】LangChain框架深度解析:从核心组件到企业级应用实战
java·人工智能·学习·langchain·tensorflow·gpt-3·ai编程
知其然亦知其所以然4 分钟前
Redis 命中率 99%,数据库却 100% CPU,是谁在捣鬼
redis·后端·面试
扎Zn了老Fe5 分钟前
告别ID冲突:分布式唯一 ID 生成方案全解析
后端
天天摸鱼的java工程师7 分钟前
后端密码存储优化:BCrypt 与 Argon2 加密方案对比
java·后端
雨中飘荡的记忆8 分钟前
Vavr:让Java拥抱函数式编程的利器
java
沈千秋.9 分钟前
xss.pwnfunction.com闯关(1~6)
java·前端·xss