Spring注解配置IOC,DI的方法详解
作者:YSOcean 发布时间:2023-10-18 14:06:23
Annotation(注解)是JDK1.5及以后版本引入的。它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查。注解是以‘@注解名’在代码中存在的。
前面讲解 IOC 和 DI 都是通过 xml 文件来进行配置的,我们发现 xml 配置还是比较麻烦的,那么如何简化配置呢?答案就是使用注解!
1、注解 @Component
我们这里有个类 Person
package com.ys.annotation;
public class Person {
private int pid;
private String pname;
private String psex;
public int getPid() {
return pid;
}
public void setPid(int pid) {
this.pid = pid;
}
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
public String getPsex() {
return psex;
}
public void setPsex(String psex) {
this.psex = psex;
}
}
如果我们不使用注解,通过前面讲解的,要想让 Spring 容器帮我们产生 Person 对象,我们要进行如下配置:
applicationContext.xml
配置:
<bean id="person" class="com.ys.annotation.Person"></bean>
如果使用注解呢?
第一步:在 applicationContext.xml 中引入命名空间
这里我们简单讲解一下这里引入的命名空间,简单来说就是用来约束xml文件格式的。第一个 xmlns:context ,这表示标签格式应该是<context:标签名>
第二步:在 applicationContext.xml 文件中引入注解扫描器
<!-- 组件扫描,扫描含有注解的类 -->
<context:component-scan base-package="com.ys.annotation"></context:component-scan>
base-package
:表示含有注解类的包名
如果扫描多个包,则上面的代码书写多行,改变 base-package 里面的内容即可!
第三步:在 Person 类中添加注解@Component
第四步:测试
@Test
public void testAnnotation(){
//1、启动 spring 容器
//2、从 spring 容器中取出数据
//3、通过对象调用方法
ApplicationContext context =
new ClassPathXmlApplicationContext("applicationContext.xml");
Person person = (Person) context.getBean("person");
System.out.println(person.getPname());
}
如果看完上面的注解配置,你一脸懵逼,那没关系,我们下面来详细讲解。
@Component
如果一个类上加了@Component注解,就会进行如下的法则
如果其value属性的值为""
@Component
publicclassPerson{}
等价于
<beanid="person"class="..Person">
如果其value属性的值不为""
@Component("p")
publicclassPerson{}
等价于
<beanid="p"class="..Person">
那么这就很好理解测试程序中,我们直接 context.getBean("person")
这样写。
2、@Repository @Service @Controller
此外:下面三个注解是 @Component 注解的衍生注解,功能一样
@Repository :dao层
@Service:service层
@Controller:web层
3、注解@Resource
@Resource 注解,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。 通过 @Resource 的使用来消除 set ,get方法。
首先创建一个 学生类 Student.java
然后在 Person 类中添加一个属性 Student
那么我们如何获取 Person 对象,并调用 showStudent()方法呢?这个问题简化就是如何给属性 Student 实例化,也就是依赖注入
不使用注解:
<property name="students">
<ref bean="student"/>
</property>
<bean id="student" class="com.ys.annotation_di.Student"></bean>
使用注解:
使用注解:
@Resource注解以后,判断该注解name的属性是否为""(name没有写)
①、如果没有写name属性,则会让属性的名称的值和spring配置文件bean中ID的值做匹配(如果没有进行配置,也和注解@Component进行匹配),如果匹配成功则赋值,如果匹配不成功,则会按照spring配置文件class类型进行匹配,如果匹配不成功,则报错
②、如果有name属性,则会按照name属性的值和spring的bean中ID进行匹配,匹配成功,则赋值,不成功则报错
4、注解 @Autowired
功能和注解 @Resource 一样,可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。只不过注解@Resource 是按照名称来进行装配,而@Autowired 则是按照类型来进行装配。
第一步:创建接口 PersonDao
package com.ys.autowired;
public interface PersonDao {
public void savePerson();
}
第二步:创建一个接口实现类 PersonDaoImplOne
package com.ys.autowired;
import org.springframework.stereotype.Component;
@Component("personDaoImplOne")
public class PersonDaoImplOne implements PersonDao{
@Override
public void savePerson() {
System.out.println("save Person One");
}
}
第三步:创建PersonService
package com.ys.autowired;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service("personService")
public class PersonService{
@Autowired
private PersonDao personDao;
public void savePerson() {
this.personDao.savePerson();
}
}
注意:这里我们在
private PesronDao personDao
上面添加了注解 @Autowired,它首先会根据类型去匹配,PersonDao 是一个接口,它的实现类是PesronDaoImpOne
,那么这里的意思就是:PersonDao personDao = new PersonDaoImpOne();
那么问题来了,如果 PersonDao 的实现类有多个呢?我们创建第一个实现类 PersonDaoImpTwo
如果还是向上面那样写,那么测试就会报错。怎么解决呢?
第一种方法:更改名称
第二种方法:@Autowired 和 @Qualifier("名称") 配合使用
在使用@Autowired时,首先在容器中查询对应类型的bean
如果查询结果刚好为一个,就将该bean装配给@Autowired指定的数据
如果查询的结果不止一个,那么@Autowired会根据名称来查找。
如果查询的结果为空,那么会抛出异常。解决方法时,使用required=false
来源:https://www.cnblogs.com/ysocean/p/7472072.html
猜你喜欢
- 一、多表联合分页查询1.多表联合查询结果集建议使用VO类,当然也可以使用resultMappackage com.cjhx.tzld.ent
- 那么Http协议中的Multipart是个什么东东?下面是摘抄http协议1.1的一段话:
- 技术场景在日常的开发、测试或运维的过程中,经常存在这样的场景,开发人员在代码中使用日志工具(log4j、slf4j)记录日志,比如请求ID、
- 类锁和对象锁是否会冲突?对象锁和私有锁是否会冲突?通过实例来进行说明。一、相关约定为了明确后文的描述,先对本文涉及到的锁的相关定义作如下约定
- Spring提供的工具类,主要用于框架内部使用,这个类提供了一些简单的方法,并且提供了易于使用的方法在分割字符串,如CSV字符串,以及集合和
- 一、java多线程基本入门java多线程编程还是比较重要的,在实际业务开发中经常要遇到这个问题。 java多线程,传统创建线程的方式有两种。
- java读写ini文件、FileOutputStream在上课让学生练习文件读写,就让他们做了一个使用文件保存账号和密码的练习,有一个比较爱
- 本文实例讲述了java实现的RSA加密算法。分享给大家供大家参考,具体如下:一、什么是非对称加密1、加密的密钥与加密的密钥不相同,这样的加密
- 配置文件形式pom.xml<?xml version="1.0" encoding="UTF-8&quo
- 一. SpringBoot中实现Session共享1. 创建web项目我们按照之前的经验,创建一个web程序,并将之改造成Spring Bo
- 建议缓存放到 service 层,你可以自定义自己的 BaseServiceImpl 重写注解父类方法,继承自己的实现。为了方便,这里我们将
- 大致思路:注解实现方式:就是用 反射机制. 获取指定的包下使用了注解的类,存储在一个map容器, 然后获取map容器下类的属性, 利用反射给
- 对于java开发人员来说,Idea的普及率已经很高了。但是还是很多好用的技巧没有用到,只是用到一些基本的功能,蛮浪费IDEA这个优秀的IDE
- 前言最近VS2019正式版发布了,装下来顺便试用了一下C#8.0,最大的看点应该就是可空引用类型了。不过C#8.0仍然处于Beta的状态,而
- 第一部分: 使用idea 打包工程jar 1.准备好一份 开发好的 可执行的 含有main方法的&nbs
- 因为公司业务需要,需要把性能日志和业务日志分开打印,用elk收集处理,所以需要对不同的业务的日志,打印到不同文件。使用的是spring bo
- 一、TkMybatisTkmybatis 是基于 Mybatis 框架开发的一个工具,通过调用它提供的方法实现对单表的数据操作,不需要写任何
- 本文实例为大家分享了Swing拆分窗格控件JSplitPane的使用方法,供大家参考,具体内容如下package day1115;impor
- spring容器是负责实例化、配置、组装组件的容器。容器的配置有很多,常用的是xml、Java注解和Java代码。在spring中Ioc容器
- 在分布式系统中,我们会需要 ID 生成器的组件,这个组件可以实现帮助我们生成顺序的或者带业务含义的 ID。目前有很多经典的 ID 生成方式,