Spring IOC容器Bean对象管理-注解方式

目录

1、Bean对象常用注解介绍

2、注解示例说明


1、Bean对象常用注解介绍

  1. @Component 通用类组件注解,该类被注解,IOC容器启动时实例化此类对象
  2. @Controller 注解控制器类
  3. @Service 注解业务逻辑类
  4. @Respository 注解和数据库操作的类,如DAO类
  5. @Resource 装配注解,优先按名称装配,如果名称匹配不上,则按照类型匹配
  6. @Autowired 装配注解,按类型装配(Spring 内置)
  7. @Inject 装配注解,按类型装配(JSR-330标准)
  8. @PostConstruct 方法注解,功能参考xml文件中的init-method,在实例化对象后自动执行
  9. @Scope Bean属性注解,功能参考xml文件中的Scope属性,非WEB环境有多例和单例两种,注解不写value或者不写此注解的情况下,默认是单例
  10. @Value 属性注解,为Bean对象注入静态数据,通常属性注入的值来自某个配置文件

2、注解示例说明

IOC容器注解方式配置Bean需要如下步骤:

1、applicationContext.xml加入扫描的包,此包项下的类被IOC容器扫描,如有注解,则实例化对象

    <!-- 扫描注解包--><context:component-scan base-package="com.text"/><!-- 加载配置文件 --><context:property-placeholder location="classpath:config.properties"/>

        配置文件config.properties(示例jdbc连接)                

jdbc.url=jdbc:mysql://xxx.xxx.xxx.xxx:3306/xxx

 2、配置Bean注解

package com.text.dao.impl;
import com.text.dao.StudentDao;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Repository;
@Repository
@Scope("prototype") //多例,只是程序模拟,实际项目上大部分是单例
public class StudentDaoImpl implements StudentDao {@Value("${jdbc.url}")private String url;public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}
}
package com.text.service.impl;
import com.text.dao.StudentDao;
import com.text.service.StudentService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service
public class StudentServiceImpl implements StudentService {/*** @Resource 注解后,先从容器中找bean名称=studentDao的对象,没找到(系统中实例对象名称是studentDaoImpl)* 再通过类型StudentDao寻找,找到studentDaoImpl,注入到studentServiceImpl对象中* 由于studentDao是私有属性,IOC容器会通过反射技术将studentDao改为puclic属性(修改modifier值),* 然后赋值,赋值后再次将studentDao设置私有属性;此种方式和xml中的property的方式不同,property的方式是通过* 反射调用SetStudentDao方法实现注入*/@Resourceprivate StudentDao studentDao;public StudentDao getStudentDao() {return studentDao;}public void setStudentDao(StudentDao studentDao) {this.studentDao = studentDao;}
}

测试类:

package com.text.entity;import com.text.dao.StudentDao;
import com.text.dao.impl.StudentDaoImpl;
import com.text.service.impl.StudentServiceImpl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test {public static void main(String[] args) {String configLocation = "classpath:applicationContext.xml";ApplicationContext context = new ClassPathXmlApplicationContext(configLocation);System.out.println("==========IOC容器完成初始化==========");String[] beanDefinitionNames = context.getBeanDefinitionNames();for(String beanDefinitionName:beanDefinitionNames) {System.out.println(beanDefinitionName);//studentDaoImpl  studentServiceImpl}StudentDao studentDao1 = context.getBean("studentDaoImpl", StudentDao.class);StudentServiceImpl studentService = context.getBean("studentServiceImpl", StudentServiceImpl.class);StudentDao studentDao2 = studentService.getStudentDao();System.out.println(studentDao1 == studentDao2);//false,studentDaoImpl scope=多例StudentDaoImpl studentDao3 = (StudentDaoImpl)studentService.getStudentDao();System.out.println(studentDao3.getUrl());//jdbc:mysql://xxx.xxx.xxx.xxx:3306/xxx}
}

 特别说明:

@Resource 注解StudentServiceImpl 后,先从容器中找bean名称=studentDao的对象,没找到(系统中实例对象名称是studentDaoImpl)再通过类型StudentDao寻找,找到studentDaoImpl,注入studentServiceImpl对象的studentDao属性中,由于studentDao是私有属性,IOC容器会通过反射技术将studentDao改为puclic属性(修改modifier值),然后赋值,赋值后再次studentDao设置私有属性;此种方式和xml中的property的方式不同,property的方式是通过反射调用SetStudentDao方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1540004.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

了解Node开发基础知识

目录 定义架构应用场景安装版本工具代码执行REPL传递参数输出全局对象 定义 Node.js 是一个基于 V8 JavaScript 引擎构建的运行时环境&#xff0c;允许你在服务器端运行 JavaScript 代码。Node.js 允许开发者使用 JavaScript 编写服务器端代码&#xff0c;实现前后端代码的统一…

Windows【环境 01】服务器系统重装后的服务恢复(ES\Redis\Jafka\Tomcat)环境变量和服务注册

服务器系统重装后的服务恢复 1.原因2.问题处理2.1 JDK2.2 Elasticsearch2.3 Redis2.4 Jafka2.5 Tomcat 3.总结 1.原因 Windows 服务器系统盘损坏&#xff0c;换了硬盘并重做了系统&#xff0c;其他磁盘未损坏但安装的服务无法正常运行了&#xff0c;包括&#xff1a; Elastic…

2.计算机网络基础

2. 计算机网络基础 (1) 计算机网络的定义 计算机网络是指将地理位置不同、具有独立功能的多个计算机系统通过通信线路和设备连接起来,以功能完善的网络软件实现网络中资源共享的系统。最简单的定义是:计算机网络是一些互相连接的、自治的计算机系统的集合。最庞大的计算机网…

JAVA-期末成绩计算

要求 总评成绩 期末成绩*0.6 平时成绩*0.4 输入总评成绩和平时成绩&#xff0c;输出期末成绩要考几分&#xff08;0<平时成绩<40&#xff0c;0<总评成绩<100&#xff09; 要求能多次运行&#xff08;退出程序停止&#xff09; 代码 import java.util.Scanne…

db2恢复数据库

db2licm -l检查下license IBM Support: Fix Central - Please wait, Select fixes db2 force application all db2ckbkp -H JYC.0.DB2.NODE0000.CATN0000.20240603223001.001 db2 "restore db jyc logtarget x:\db2\log" db2 "rollforward db jyc to end of log…

前端vue-复选框或者是下拉框的选择

单选框以及复选框还是下拉框都和name的值没有关系&#xff0c;但是他们之间得写&#xff0c;data中要写标签内v-model的值&#xff0c;在data中这个v-model绑定的值的值是value中的其中一个值或者是多个值&#xff0c;是默认选中的状态。

C++之深拷贝和浅拷贝*

两者本质&#xff1a; 浅拷贝&#xff1a;简单的赋值拷贝操作 深拷贝&#xff1a;在堆区中重新申请空间&#xff0c;进行拷贝操作new & delete 注意事项&#xff1a;堆区是在地址中重新申请空间&#xff0c;所以后续一系列操作new delete是通过指针* age进行操作&#xff0…

委托的注册和注销

让我们来回顾一下委托的内容。 委托 是一种复杂的数据类型&#xff0c;需要我们先定义出来。当定义好类型后&#xff0c;声明委托变量来使用。 可以装载方法&#xff0c;只可以装载具有相同返回类型和参数列表的方法。 委托变量名&#xff08;参数列表&#xff09;&#xf…

进击J7:对于ResNeXt-50算法的思考

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 本周任务是自行探索解决问题&#xff0c;通过此次思考过程逐渐将知识层面的学习过渡到能力层面的培养上。 一、任务 &#x1f4cc; **你需要解决的疑问&…

Zend Studio 13.6.1汉化中文版

在线汉化地址 https://download.eclipse.org/technology/babel/update-site/R0.16.1/2018-12/ 后面一直Next&#xff0c;最后让它后台自动安装 汉化完成 &#xff01;其实还是习惯用英文版&#xff01;&#xff01;&#xff01;&#xff01;&#x1f600;

Tableau Einstein 重磅亮相,融合 AI 与数据云提供统一且无缝的分析新体验!

通过内置可重复使用和可扩展的组件、语义 AI 和统一的数据&#xff0c;来加速不同部门和领域的用户工作流程。 近日&#xff0c;为期三天的 Dreamforce 2024 年度大会&#xff08;下文简称 DF24&#xff09;在美国旧金山隆重举行。 其中&#xff0c;最受关注的莫过于 Salesfor…

动态路由---OSPF协议基础

一、动态路由 1.1、定义 动态路由是指在网络通信过程中&#xff0c;路由器根据当前网络的状态和拓扑结构等信息&#xff0c;动态计算出最优的数据传输路径。这一过程依赖于路由器之间的路由信息交换和路由表的维护。当网络拓扑结构发生变化时&#xff0c;如链路故障或节点增减…

.NET 一直跻身 30 大Github最活跃开源项目之列。

大家好&#xff0c;我是编程乐趣。 一直以来都在介绍.Net的热门开源项目&#xff0c;今天来说说.Net本身。 .Net在GitHub上也是一个开源项目&#xff0c;.NET 是一个由 Microsoft 和 .NET 社区共同维护的开源跨平台框架。 自 2017 年以来&#xff0c;.NET 一直是 GitHub 上最…

Debian 12上安装google chrome

当前系统&#xff1a;Debian 12.7 昨天在Debian 12.7上安装Google Chrome时&#xff0c;可能由于网络原因&#xff0c;导入公钥始终失败。 导致无法正常使用命令#apt install google-chrome-stable来安装google chrome; 解决办法&#xff1a; Step1.下载当前google chrome稳…

【JavaEE】线程创建和终止,Thread类方法,变量捕获(7000字长文)

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯&#xff0c;你们的点赞收藏是我前进最大的动力&#xff01;&#xff01;7000字长文&#xff0c;希望本文内容能够帮助到你&#xff01; 目录 一&#xff1a;创建线程五种方式 方式一&#xff1a;继承Thread类&#xff0c;…

需求2:新加字段

从今天开始&#xff0c;我想把我之前写的一些小的&#xff0c;简单的需求都通过文章的方式写出来&#xff0c;一方面是回顾梳理之前所学的知识&#xff0c;另一方面也是为了方便以后回看&#xff0c;好记性不如烂笔头。 现在的问题是这样的&#xff1a; 涛哥希望&#xff0c;加…

电脑技巧:Win11家庭版和专业版之间的区别详解

目录 一、操作系统安装层面 二、 操作系统安全层面 三、虚拟化和远程功能方面 四、硬件支持方面 五、企业管理方面 六、价格方面 七、软件功能方面 八、适合人群方面 九、如何选择 Windows 11操作系统提供了多个的版本(SKU),包括适合家庭用户的家庭版、适合专业人士…

C++刷怪笼(5)内存管理

一.前言 学习完类和对象之后&#xff0c;我们对C有了基本的了解&#xff0c;但是我们对于C的学习&#xff0c;除了广度&#xff0c;还需要深度&#xff0c;今天让我们走进底层&#xff0c;看看C对其内存是如何进行管理的。 二.正文 我们对这段代码进行详细的分析如下图&#…

微信支付开发-支付工厂H5产品代码

一、H5支付产品、Native支付产品 二、工厂父类抽象类代码开发 <?php /*** 微信父类抽象类* User: 龙哥三年风水* Date: 2024/9/19* Time: 11:33*/ namespace Payment\WechatPay; abstract class WechatPaymentHandle {/*** 下单* User: 龙哥三年风水* Date: 2024/9/19* Ti…

ByteTrack多目标跟踪流程图

ByteTrack多目标跟踪流程图 点个赞吧&#xff0c;谢谢。