[JAVAee]Spring使用注解来存储与获取Bean对象

2023-09-15 13:02:18

前置内容:[JAVAee]Spring项目的创建与基本使用_HY_PIGIE的博客-CSDN博客

先前我们在项目中注册类到spring中,要在xml中一行一行的手动添加bean标签.如果对象数目一多起来,就会显得非常繁琐.

本文章介绍了使用另一种方法,使用注解的方式快捷的完成Bean对象的存储与获取.

配置spring.xml文件

拷贝下面的内容,注意替换base-packge为所要加入的类的包

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:content="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
    <content:component-scan base-package="demo"></content:component-scan>
</beans>

按照上面的配置,spring只能扫描demo包下的类.其他地方的类都不能被识别到,就相当于没有加入到spring当中.

注解存储Bean对象 

存储Bean对象的注解有两类,类注解与方法注解.

类注解有:

@Controller、@Service、@Repository、@Component、@Configuration.

方法注解有:

@Bean

通过类注解存储Bean对象

五个类注解都可以将类注册到spring当中,并创建出Bean对象 

Controller注解

package demo;

import org.springframework.stereotype.Controller;

@Controller//加入Controller注解,将类注册到spring当中
public class UserController {
    private String name;
    public void hello(){
        System.out.println("controller-hello");
    }
}

 Service注解

package demo;

import org.springframework.stereotype.Service;

@Service//添加Service注解
public class UserService {
    private String name;
    public void hello(){
        System.out.println("service-hello");
    }
}

Repository注解 

package demo;

import org.springframework.stereotype.Repository;

@Repository//添加Repository注解
public class UserRepository {
    private String name;
    public void hello(){
        System.out.println("repository-hello");
    }
}

Configuration注解 

package demo;

import org.springframework.context.annotation.Configuration;

@Configuration//添加Configuration注解
public class UserConfiguration {
    private String name;
    public void hello(){
        System.out.println("configuration-hello");
    }
}

Component注解 

package demo;

import org.springframework.stereotype.Component;

@Component//添加Component注解
public class UserComponent {
    private String name;
    public void hello(){
        System.out.println("component-hello");
    }
}

分别获取Bean对象并使用

//获取spring上下文对象
        ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
        //分别通过getBean方法得到刚刚通过注解注册的类创建得到的Bean对象
        UserController userController = (UserController) context.getBean("userController");
        userController.hello();

        UserService userService = (UserService) context.getBean("userService");
        userService.hello();

        UserRepository userRepository = (UserRepository) context.getBean("userRepository");
        userRepository.hello();

        UserConfiguration userConfiguration = (UserConfiguration) context.getBean("userConfiguration");
        userConfiguration.hello();

        UserComponent userComponent = (UserComponent) context.getBean("userComponent");
        userComponent.hello();

 通过注解注册类,在获取Bean对象的时候注意是通过id获取的.

根据spring规定,id默认为被注册的类的首字母小写形式(通常类的首字母为大写嘛).

注意:如果类的开头两个字母都是大写,则直接使用类名作为id来获取Bean对象

例如,类名为:ABc,则ABc为id

        类名为:Abc,则abc为id

类注解间的关系

五个类注解,分别为:

①Controller-控制器:归属于业务逻辑层,用来控制用户的行为,检查用户的数据是否有效.

②Service-服务:归属于服务层,调用持久化类实现相应的功能,但不直接与数据库进行交互.

                        [持久化类,与数据库打交道的类.将接收到的数据存放到数据库中存储.]

③Repository-仓库:归属于持久层,直接与数据库打交道.通常每一个表都有一个对应的Repository

④Configuration-配置:归属于配置层,配置当前项目信息.

⑤Component-组成:归属于公共工具类.

①~④其实都包含着Component,相当于①~④都为Component的"子类"

这么多类注解,都可以把Bean对象存储到spring当中.分成五大类只是为了程序员可以通过类注解了解当前类的作用是什么. 

相当于项目开发的一种形式吧.

通过方法注解存储Bean对象

@Bean-方法注解

要搭配类注解来使用:

只有将类进行了注解spring才会将此类进行扫描,才能获取到其中的方法

@Component//使用了方法注解的类要搭配类注解来使用
          //因为spring要先扫描到UserBean类才能接着扫描此类里面的添加了注解的userBean方法
public class UserBean {
    private String name;
    
    @Bean//Bean方法注解,将方法返回的对象存储到spring中变成Bean对象
    public UserBean userBean(){
        UserBean userBean = new UserBean();
        userBean.name = "wow";
        return userBean;
    }
}
//默认是通过方法的方法名作为id来获取bean对象
UserBean userBean = (UserBean) context.getBean("userBeanMethod");

方法注解的重命名 

注意:重命名后就不能使用方法名作为id获取Bean对象了 

@Bean(name = {"user","wualala"})//还可以对其id进行重命名
                          //注意是重命名噢,重命名之和就不能用方法名来获取bean对象了
                          //注解中的name也可以是一个数组的形式,即有多个id.

注解获取Bean对象

获取Bean对象,也可以称为对象配备对象注入.

主要使用Autowired注解与Resource注解

被注入的对象的类也要加上类注解噢

获取Bean对象的方法主要有三种:

  1. 属性注入
  2. 构造方法注入
  3. setter注入

Autowired注解的方式 

1.属性注入

使用Autowired注解

@Controller//加入Controller注解,将类注册到spring当中
public class UserController {

    @Autowired//使用注解注入Bean对象userService
                //在注入后就可以在UserController对象中使用userService对象
    private UserService userService;

    public UserService getUserService(){
        return userService;
    }
}

2.构造方法注入

spring收到请求后,根据UserService类创建一个对象,并传到Autowired注解的构造方法中 

@Controller//加入Controller注解,将类注册到spring当中
public class UserController {

    private UserService userService;

    @Autowired//注解
    public UserController(UserService userService){
        this.userService = userService;
    }

    public UserService getUserService(){
        return userService;
    }
}

如果只有一个构造方法,则可以不用Autowired注解 

3.setter注入

在属性的setter方法上使用注解注入对象

@Controller//加入Controller注解,将类注册到spring当中
public class UserController {

    private UserService userService;
    public UserService getUserService(){
        return userService;
    }
    @Autowired//setter方法上加上注释
    public void setUserService(UserService userService) {
        this.userService = userService;
    }
}

@Resource与@Autowired的区别 

还有另一种注入对象的注解:

@Resource,其和@Autowired使用的方法是一致的.

但也有主要的区别:

  1. @Autowired来自于Spring,@Resource来自于JDK的注解
  2. 可设置的参数不同,@Autowried不可设置id.@Resource可以设置name,根据id获取bean对象
  3. @Autowried可以使用属性注入,构造方法注入与setter注入,而@Resource只能使用属性注入与setter注入,不能使用构造方法的注入.

同一个类多个@Bean的方法

在UserBean类中注解了多个方法存储Bean对象

在UserController类中注入的时候,需要将注入的Bean对象进行命名.

不然会因为同一个类的Bean对象不唯一而报错

但@Autowried本身并不能进行重命名,需要搭配另一个注解@Qualifier来进行重命名

或直接使用@Resource注解

同一个类有多个Bean存储

@Component//使用了方法注解的类要搭配类注解来使用
          //因为spring要先扫描到UserBean类才能接着扫描此类里面的添加了注解的userBean方法
public class UserBean {
    private String name;

    @Bean
    public UserBean user1(){
        UserBean userBean = new UserBean();
        userBean.name = "haha";
        return userBean;
    }

    @Bean
    public UserBean user2(){
        UserBean userBean = new UserBean();
        userBean.name = "dongdong";
        return userBean;
    }

    public void getName(){
        System.out.println(name);
    }
}

获取指定Bean对象方法一: 

@Autowried + @Qualifier

@Controller
public class UserController {

    @Autowired
    @Qualifier("user2")//注解定义名称
    private UserBean userBean;

    public UserBean getUserBean() {
        return userBean;
    }
}

获取指定Bean对象方法二:

@Controller
public class UserController {

    @Resource(name = "user1")
    private UserBean userBean;

    public UserBean getUserBean() {
        return userBean;
    }
}

 

更多推荐

SpringAOP

AOP实现原理SpringAOP基于动态代理实现原理:○如果被代理的对象,已经实现某个接口,则SpringAOP会使用JDKProxy(反射),基于接口的方式,创建代理对象(JDK动态代理的核心是InvocationHandler接口和Proxy类);○如果被代理的对象,没有实现某个接口,就无法使用JDKProxy去进

Linux日期和时间管理指南:日期、时间、时区、定时任务和时间同步

文章目录Linux日期和时间管理指南1.简介1.1Linux日期和时间的重要性1.2日期管理的需求2.查看当前日期和时间2.1date命令2.2cal命令2.3查看硬件时钟3.设置系统日期和时间3.1设置日期3.2设置时间3.3设置硬件时钟4.时区管理4.1查看当前时区4.2修改系统时区4.3多时区设置5.定时任务和计

【数据结构】二叉树

🔥博客主页:小王又困了📚系列专栏:数据结构🌟人之为学,不日近则日退❤️感谢大家点赞👍收藏⭐评论✍️目录一、树概念及结构1.1树的概念1.2树的相关概念1.3树的表示二、二叉树概念及结构2.1二叉树的概念2.2特殊的二叉树2.3二叉树的存储结构🗒️前言:在前面我们学习了顺序表、链表等数据结构,这些都是线性表,是

Unity中 UI Shader的基本功能

文章目录前言一、实现思路1、暴露一个2D类型的属性来接受UI的纹理2、设置shader的层级为TransParent半透明渲染层级,一般UI都是在这个渲染层级3、更改混合模式,是UI使用的纹理,该透明的地方透明二、代码实现前言Unity中UIShader的基本功能一、实现思路1、暴露一个2D类型的属性来接受UI的纹理/

mysql内连接与外连接详解

内连接与外连接内连接外连接在数据库中,连接操作是一种把两个或者多个表的记录组合在一起的操作,常用的有内连接(InnerJoin)、外连接(OuterJoin)等。内连接内连接(InnerJoin):内连接是最常用的连接操作,它只返回两个表中满足连接条件的记录。在Java中,可以使用SQL语句中的INNERJOIN关键字

【前段基础入门之】=>初识 HTML

文章目录前言HTML的详情简介HTML发展史HTML入门1.HTML标签元素2.HTML标签属性3.HTML的标准结构总结前言在整个前端开发中,必须掌握的技术栈为:HTML,CSS,JavaScript,它们三者,共同组成了前端开发的基础生态,以至于后续的进阶式开发,都是在这三者的基础上的扩展,同时它们三者在前端开发中

基于微信小程序的美食推荐系统设计与实现(源码+lw+部署文档+讲解等)

前言💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗👇🏻精彩专栏推荐订阅👇🏻2023-2024年最值得选的微信小程序毕业设计选题大全:100个热门选

20230919在WIN10下使用python3将PDF文档转为DOCX格式的WORD文档

20230919在WIN10下使用python3将PDF文档转为DOCX格式的WORD文档2023/9/1911:20pythonpdfwordhttps://blog.csdn.net/u013185349/article/details/130059657Python实现PDF转Word文档AcceptedLin已

上PICO,沉浸式观看亚运直播,参与跨国界游戏竞技

备受瞩目的杭州第19届亚运会,将于9月23日正式开幕。据悉,这也是有史以来项目最多的一届亚运会,除部分传统奥运项目外,还包含武术、藤球、板球、克柔术、柔术等亚洲特色项目,以及霹雳舞、电子竞技等深受年轻人喜爱的新兴项目。作为全球领先的VR品牌,PICO将对本届杭州亚运会进行全程赛事直播、回放。这也是继卡塔尔世界杯、成都大

SI3262:国产NFC+MCU+防水触摸按键三合一SoC芯片

目录SI3262简介特点结构框图芯片特性SI3262简介Si3262是高度集成ACD低功耗MCU+NFC+15通道防水触摸按键的SoC芯片。其MCU模块具有低功耗、LowPinCount、宽电压工作范围,集成了13/14/15/16位精度的ADC、LVD、UART、SPI、I2C、TIMER、WUP、IWDG、RTC、

百度测开面试题分享

1、java常用的异常处理机制?Java常用的异常处理机制有以下几种:1)try-catch-finally语句:用于捕获和处理异常。将可能抛出异常的代码放在try块中,然后在catch块中处理异常。无论是否发生异常,finally块中的代码都会被执行。try{//可能抛出异常的代码}catch(ExceptionTy

热文推荐