【Spring5】基于注解的Bean管理简直是Spring中的Spring
创始人
2024-04-04 19:44:31

在这里插入图片描述


文章目录

  • 1 什么是注解
  • 2 基于注解方式实现对象的创建
  • 3 组件扫描配置的细节
  • 4 基于注解实现属性的注入
    • 4.1 几种注解概述
    • 4.2 @Autowire注解演示
    • 4.3 @Qualifier注解演示
    • 4.4 @Value注解演示
  • 5 纯注解的开发模式
  • 写在最后


1 什么是注解

注解是代码中特殊的标记,格式如下:

@注解名称(属性名称=属性值,属性名称=属性值......)

注解可以作用在类、方法、属性上,在上一节中,我们对IOC与解耦合有了深刻的理解,并对基于xml配置的方式操作Bean也有了一定认识。可以体会到,当bean足够多时,配置xml就会变得很麻烦!而使用注解的目的就是为了能够简化xml配置。

Spring针对Bean管理中创建对象提供注解, 以下四个注解都可以用来创建bean实例,只是为了便于开发者清晰区分当前层:
(1)@Component
(2)@Service
(3)@Controller
(4)@Repository


2 基于注解方式实现对象的创建

Demo演示:
1.引入依赖, 除了上节IOC操作中的四个jar包以外,还需要导入spring-aop-5.2.6.RELEASE.jar ,文末提供相关资源下载链接。
在这里插入图片描述
2.导入名称空间
在这里插入图片描述

3.开启组件扫描: 告诉Spring容器哪些类需要使用注解。




4.创建类,并添加注解。 注解中的Value值可以省略,若省略,默认为类名首字母小写的值。

import org.springframework.stereotype.Component;/*** @author 兴趣使然黄小黄* @version 1.0*/
@Component(value = "userService") //
public class UserService {public void doAnyThing(){System.out.println("doing...");}
}

5.尝试调用方法。

public class TestDemo {@Testpublic void test(){ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");UserService userService = context.getBean("userService", UserService.class);userService.doAnyThing();}
}

在这里插入图片描述


3 组件扫描配置的细节

可以对组件扫描进行个性化配置。

示例一:设置扫描的内容



use-default-filters=“false”表示不使用默认filters,默认情况下是扫描当前基本包下所有类的注解。
context:include-filter,用于设置扫描哪些内容。
示例一中的代码表示扫描com.ithxh.spring5下包的类中Controller注解内容。

示例二:设置不扫描的内容



示例二中默认扫描当前包下所有内容,但是 context:include-filter,用于设置不扫描哪些内容, 因此,不会扫描Controller注解内容。


4 基于注解实现属性的注入

4.1 几种注解概述

针对对象类型的注入相关注解如下:

  • @Autowired:根据属性类型进行自动装配。
  • @Qualifier:根据属性名称进行注入。通过设置value属性值。
  • @Resource:可以根据类型,可以根据名称注入。如果设置了name属性值,则是根据名称注入。但是与前两种的区别是,该注解是在javax扩展包中的,因此Spring更推荐使用前两种注解。

注入普通类型的相关注解:

  • @Value:注入普通属性。

4.2 @Autowire注解演示

@Autowired 注解Demo演示

0.准备!创建UserService、UserDao、UserDaoImpl,其中UserDaoImpl是UserDao接口的实现类
1.完成UserService和UserDao对象的创建,在两个类上添加注解。
2.在UserService中添加UserDao类型属性,并在该属性上使用注解完成在service注入dao对象。
需要注意,不要给多个Dao实现类添加注解,否则自动装配会引发异常!Spring并不知道该给哪个类进行装配(类型相同)
(我帮你试过了,害不害怕!先往下看,解决方法一会儿说)
在这里插入图片描述
完整代码及测试如下:

UserService.java

import com.ithxh.spring5.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class UserService {@Autowiredprivate UserDao userDao;public void doAnyThing(){System.out.println("UserService doing...");userDao.add();}
}

UserDao.java

public interface UserDao {public void add();
}

UserDaoImpl.java

import org.springframework.stereotype.Repository;@Repository
public class UserDaoImpl implements UserDao{@Overridepublic void add() {System.out.println("UserDao add......");}
}

测试类

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.testng.annotations.Test;public class TestDemo {@Testpublic void test(){ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");UserService userService = context.getBean("userService", UserService.class);userService.doAnyThing();}
}

在这里插入图片描述

4.3 @Qualifier注解演示

在自动装配注解演示中,尝试一个接口有多个实现类时,引发了异常。这就需要@Qualifier注解和@Autowire注解配合来解决了!

@Autowire根据类型进行自动装配,但是一个接口可以有多个实现类!Spring对此表示疑惑,并不清楚该拿哪个实现类进行装配,可不就引发异常了吗!

通过@Qualifier注解,可以指定名称,告诉Spring使用哪个具体的实现类!

我们在上述演示代码的基础上添加一个UserDao的实现类UserDaoImpl2:

public class UserDaoImpl2 implements UserDao{@Overridepublic void add() {System.out.println("UserDao2 add......");}
}

此时如果想要将该实现类装配到UserService的UserDao类型的属性中,需要如下两步:
1.先给该实现类添加注解,可以设定value,也可以使用默认,默认为类名首字母小写的值,即name=userDaoImpl2
在这里插入图片描述

2.在UserService类中UserDao属性上添加@Qualifier注解,并指定名称!
在这里插入图片描述

3.测试后,可以正常访问到该实现类的方法。
在这里插入图片描述

4.4 @Value注解演示

    @Value(value = "黄小黄")String name;

5 纯注解的开发模式

在这里只需要大概体会一下即可,实际使用SpringBoot,简化Spring。
在本篇案例中,我们首先在配置文件中进行了配置:
在这里插入图片描述
而在纯注解开发模式中,根本不需要写配置文件,而是 拿配置类代替:

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;@Configuration //作为配置类,替代xml配置文件
@ComponentScan(basePackages = {"com.ithxh.spring5"})
public class SpringConfig {
}

其余代码不变,更改测试类:

    @Testpublic void test(){ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);UserService userService = context.getBean("userService", UserService.class);userService.doAnyThing();}

在这里插入图片描述


写在最后

 到这里,Spring中的IOC容器就已经讲解完了,IOC实验使用到的jar包下载链接附上:spring-5.2.6.RELEASE-dist+commons-logging-1.1.1.jar
接下来将会继续讲解Spring中的AOP面向切面的内容,敬请关注!
在这里插入图片描述

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...