首页 > 其他分享 >[spring] spring学习笔记(3): 通过注解实现依赖注入

[spring] spring学习笔记(3): 通过注解实现依赖注入

时间:2024-02-10 22:45:16浏览次数:20  
标签:spring 笔记 publish 注解 ud public 注入

注解Annotation

注解是代码中的一种特殊标记,java中的格式为@Anno_Name(pro=value) 注解可以被使用在方法,类和属性上;在spring中,使用注解来实现自动装配,可以简化Bean的配置,基本步骤如下:

  • 引入依赖
  • 开启组件扫描
  • 使用注解定义Bean
  • 注入依赖

引入依赖

在新建的spring项目下的src/main/resources路径下,创建bean配置文件和其他依赖配置文件

开启组件扫描

spring默认不开启注解方式, 需要额外开启功能 -- 在Beans标签里,加入

xmlns: context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/context
		    http://springframework.org/schema/context/spring-context.xsd"

然后开启功能,注意这里base-package的值是需要扫描的包名称,当这个包里存在有特定注解的方法/类/属性时,spring框架会自动扫描并装载至容器中

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

比如我在src/main/java下建立一个包com.example.demo,并在这个包里创建了一些有注解的类以及属性,那么spring会查找到这些内容并自动加载

排除某些组件

context : exclude-filter标签,制定排除规则
type设置排除或包含的依据
type: annotation 根据注解排除,expression中标明排除的注解的全类名
type: assignable 根据类型排除,expression中标明排除的类型的全类名

仅扫描指定组件

context : include-filter标签,在原有的扫描规则上添加规则
use-default-filter 设为false关闭默认筛选,默认是包下所有的类
type设置排除或包含的依据
type: annotation 根据注解排除,expression中标明排除的注解的全类名
type: assignable 根据类型排除,expression中标明排除的类型的全类名

使用注解定义

java提供了四种注解,spring可以根据这些注解将他们变成对应的Bean

注释 说明
@Component 用于描述spring的Bean,是一个广泛的概念,可以用在任何层次上,仅仅表示容器里的一个组件
@Repository 用于数据访问层Dao,作用与@Component相同
@Service 用于业务层Service,作用与@Component相同
@Controller 用于控制层,作用与@Component相同

实例演示

在我们之前创建的包com.example.demo下新建一个类User

// 相当于在xml里定义<bean id="user" class="...">
@Component(value="user")
public class User() {...}
// 接下来我们可以新建一个测试类,还是按照之前的方法返回Bean对象,但是这一次我们不需要在xml里定义Bean了

⚠️ 注解要加在类或实现类上,接口不需要

注入依赖

@Autowired

@Autowired可以写在构造方法,方法,形参,属性和注解之前;默认情况下Bean对象应当已经被创建

属性注入

使用@Autowired完成属性注入,对应对象会根据类型自动找到对象,完成注入

// 假设我现在有一个UserService类和一个UserDao类
// 并且在UserDao中存在方法publish, 会打印一个字符串

@Service // 这个是创建Bean对象
public class UserServiceImpl implements UserService {
	@Autowired // 这个是根据类型找到注入的对象属性
	private UserDao ud;
	
	// 类方法,引用其他类的publish方法
	public void publish() {
		System.out.println("service ===>");
		ud.publish();
	}
}

setter注入

同样的代码里,添加一个set方法

@Service
public class UserServiceImpl implements UserService { 
	private UserDao ud;
	
	@Autowired
	public void setUserDao(userDao ud) {
		this.ud = ud;
	}
	// publish(...)
}

构造方法注入

也可以在构造方法里注入

@Service
public class UserServiceImpl implements UserService {
	private userDao ud;

	@Autowired
	public userServiceImpl(userDao ud) {
		this.ud = ud;
	}
	//publish(...)
}

以及,形参注入

@Service
public class UserServiceImpl implements UserService {
	private userDao ud;

	public userServiceImpl(@Autowired userDao ud) {
		this.ud = ud;
	}
	// publish(...)
}

还有其他使用场景。。。

只有一个构造函数,且该函数需要传入参数

例如上面的UserServiceImpl构造函数里只传入了一个参数对象,这时候可以不写注解

@Autowired + @Qualifier

单独的autowired注解是根据类型来注入,加入qualifier实现根据名称注入,适用于拥有复数实现类的类
假设userDao类有两个实现类 -- userDaoImpl & userDaoImplll, 而我们需要注入userDaoImplll类

@Service // 这个是创建Bean对象
public class UserServiceImpl implements UserService {
	@Autowired // 这个是根据类型找到注入的对象属性
	@Qualifier(value = "userDaoImplll") // 注入了特定的实现类
	private UserDao ud;
	
	// 类方法,引用其他类的publish方法
	public void publish() {
		System.out.println("service ===>");
		ud.publish();
	}
}

@Resource

通过resource注解也可以完成注入,和autowired注解存在以下不同

  • @Resource属于jdk扩展包,需要由外部引入(特定java版本),可以说是标准注解;而@Autowired来自spring框架
  • resource默认根据名称注入,若名称未指定,则使用属性名,再不行就根据类型
  • resource可以用于属性与setter

根据名称注入

@Controller(value="MyUserController") // 指定名称
public class UserControllerImpl implements UserController {...}

// 准备注入
@Service
public class UserServiceImpl implements UserService {
	@Resource(name="MyUserController")
	private UserController uc;

根据属性注入

@Controller(value="MyUserController") // 指定名称
public class UserControllerImpl implements UserController {...}

// 准备注入
@Service
public class UserServiceImpl implements UserService {
	@Resource  // 不指定名称, 注意下面的属性名称
	private UserController MyUserController;

根据类型注入

就是不指定名称(resource注解后为空);以及属性名称也不一样,那么resource会根据类型去寻找对应的类,注入对象

全注解开发

省去spring的xml配置文件,使用配置类来替代

标签:spring,笔记,publish,注解,ud,public,注入
From: https://www.cnblogs.com/Akira300000/p/18002291

相关文章

  • fast.ai 深度学习笔记(三)
    深度学习2:第1部分第6课原文:medium.com/@hiromi_suenaga/deep-learning-2-part-1-lesson-6-de70d626976c译者:飞龙协议:CCBY-NC-SA4.0来自fast.ai课程的个人笔记。随着我继续复习课程以“真正”理解它,这些笔记将继续更新和改进。非常感谢Jeremy和Rachel给了我这个......
  • 【学习笔记】李宏毅 2023 春机器学习课程听课记录
    1ChatGPT原理剖析ChatGPT的社会化:学会文字接龙人类引导文字接龙方向模仿人类喜好用增强式学习向模拟老师学习1.1预训练(Pre-train)ChatGPT真正在做的事情本质上是文字接龙,将其看成一个函数\(f(x)\),其中的\(x\)自变量可以是用户输入的一个语句,得到的函数就是接下来......
  • fast.ai 机器学习笔记(一)
    机器学习1:第1课原文:medium.com/@hiromi_suenaga/machine-learning-1-lesson-1-84a1dc2b5236译者:飞龙协议:CCBY-NC-SA4.0来自机器学习课程的个人笔记。随着我继续复习课程以“真正”理解它,这些笔记将继续更新和改进。非常感谢Jeremy和Rachel给了我这个学习的机会。......
  • fast.ai 机器学习笔记(四)
    机器学习1:第11课原文:medium.com/@hiromi_suenaga/machine-learning-1-lesson-11-7564c3c18bbb译者:飞龙协议:CCBY-NC-SA4.0来自机器学习课程的个人笔记。随着我继续复习课程以“真正”理解它,这些笔记将继续更新和改进。非常感谢Jeremy和Rachel给了我这个学习的机会......
  • fast.ai 机器学习笔记(三)
    机器学习1:第8课原文:medium.com/@hiromi_suenaga/machine-learning-1-lesson-8-fa1a87064a53译者:飞龙协议:CCBY-NC-SA4.0来自机器学习课程的个人笔记。随着我继续复习课程以“真正”理解它,这些笔记将继续更新和改进。非常感谢Jeremy和Rachel给了我这个学习的机会。......
  • fast.ai 机器学习笔记(二)
    机器学习1:第5课原文:medium.com/@hiromi_suenaga/machine-learning-1-lesson-5-df45f0c99618译者:飞龙协议:CCBY-NC-SA4.0来自机器学习课程的个人笔记。随着我继续复习课程以“真正”理解它,这些笔记将继续更新和改进。非常感谢Jeremy和Rachel给了我这个学习的机会。......
  • Spring 基础
    Spring基础参考资料Spring的核心包括2个概念:控制反转(IOC)和面向切面(AOP)。我的SpringBoot学习之路!-知乎(zhihu.com)控制反转(IOC)的核心思想:把主动权交给用户。狂神说Java:《Spring5最新完整教程IDEA版》《SpringBoot最新教程IDEA版》开源项目:Spr......
  • NOI 2010 做题笔记
    NOI2010Day1T1能量采集观察到\((0,0)\)与\((x,y)\)连线上的整点个数正好是\(\gcd(x,y)-1\)(不包括端点),于是总能量损失即为:\[\begin{aligned}{}&\sum\limits_{T=l}^{r}f(T,c)\sum\limits_{i=0}^{n}p_iT^i\\=&\sum\limits_{i=0}^{n}p_i\sum\limits_{T......
  • 一月读书笔记《程序员修炼之道:从小工到专家》
    首先,书中对个人责任和职业发展观念的深刻阐述,让我深受触动。我意识到,作为一名程序员,我们所承担的不仅仅是一份工作,更是一份沉甸甸的责任。每一行代码、每一个程序都是我们用心创造的作品,它们不仅仅是为了完成任务而存在,更是在无形中推动着社会的进步。我们的工作成果可能会影响到......
  • 一月读书笔记《人月神话》
    《人月神话》读后感作为一名学生,我对软件工程领域一直充满好奇和热情。在这个信息技术迅猛发展的时代,软件已经渗透到我们生活的方方面面。《人月神话》是软件工程领域的经典之作,由经验丰富的软件项目经理FrederickP.Brooks,Jr.所著。作者以自己在IBM公司担任大型软件项目经理......