springIoc以及注解的使用

注解

注解的定义

注解(Annotation)是一种在 Java 程序中以元数据的形式对代码进行标记和说明的机制。它可以被添加到类、方法、字段、参数等程序元素上,用于提供额外的信息和指示。
也就是说注解是一种标记

注解怎么生效呢?

通过扫描的方式生效,spring容器进行指定包下的文件扫描,然后根据注解进行后续操作

注解的类型

  1. 内置注解(Built-in Annotations):Java语言提供了一些内置的注解,用于标记和处理特定的场景和行为。例如:
    • @Override:用于标记方法覆盖父类方法。
    • @Deprecated:用于标记已过时的方法、类或字段。
    • @SuppressWarnings:用于抑制编译器警告信息。
  2. 元注解(Meta-Annotations):元注解是用于定义和处理注解本身的注解。它们可以用于 自定义注解,指定注解的行为、作用范围等。常见的元注解包括:
    • @Target:指定注解可应用的目标元素类型(类、方法、字段等)。
    • @Retention:指定注解的保留策略(源代码、编译时、运行时)。
    • @Documented:指定注解是否包含在API文档中。
  3. 自定义注解(Custom Annotations):
    • 开发者可以根据需要自定义自己的注解,以实现特定的功能和逻辑。自定义注解需要使用元注解来进行配置,并通过反射机制来获取注解信息。自定义注解可以应用于类、方法、字段等代码元素,并可以根据注解信息做出相应的处理。

简单来说内置注解就是 Java语言提供的一些注解,不需要导依赖和导包使用。元注解也就是注解的注解 专门用来标注注解,自定义注解 ,开法者根据需要自定义自己的注解,也就是自己做的一些规定,通常需要导包进行使用。

配置包扫描

	<context:component-scan base-package="包名"/>

排除包下的一些信息

	<context:exclude-filter type="annotion" expression="类的全限定符"/>

指定包含内容

	<context:include-filter type="annotion" expression="类的全限定符"/>

type="annotation" 表示使用注解作为过滤器的类型,它会匹配带有特定注解的类进行组件扫描。

bean的作用域和周期方法注解

定义

作用域指的是在Spring容器中管理的Bean对象的生命周期范围和可见性。不同的作用域决定了在容器中创建的Bean实例的行为方式。
可以使用注解的形式进行规定

在Spring框架中,常见的Bean作用域(scope)包括:
  • Singleton(单例):
    在整个应用程序中只存在一个Bean实例,由Spring容器管理。每次请求该Bean时,都会返回同一个实例。
  • Prototype(原型):每次请求该Bean时,容器都会创建一个新的Bean实例,并返回该实例。
  • Request(请求):每个HTTP请求都会创建一个新的Bean实例,该实例仅在当前请求中有效。
  • Session(会话):每个用户会话都会创建一个新的Bean实例,该实例在整个会话期间有效。
  • GlobalSession(全局会话):仅适用于Portlet环境,表示全局会话作用域。
    常用的生命周期方法注解包括:

周期的定义

周期(Lifecycle)指的是对象的创建、初始化、使用和销毁过程中的各个阶段。在Spring框架中,可以通过声明周期方法注解来定义在Bean的生命周期中执行的特定方法。

  • @PostConstruct:在Bean的初始化阶段,即依赖注入完成后调用的方法上添加该注解。该方法会在构造函数执行之后、任何自动装配发生之前被调用。
  • @PreDestroy:在Bean销毁之前调用的方法上添加该注解。该方法会在Bean被容器销毁之前被调用。
    这两个就类似于前面说到的bean中的init-method 和destroy-method方法

注解Autowired的使用

它是spring框架的注解,用于自动装配bean,使用Autowired注解可以简化依赖注入。当创建一个Bean时,会自动检测该Bean所需要的依赖,将其注入到Bean中

  1. 构造方法注入:
    在构造方法上使用 @Autowired的话,spring会尝试通过匹配类型或名称来自动注入构造方法所需的依赖项
public class MyBean {private DependencyBean dependency;@Autowiredpublic MyBean(DependencyBean dependency) {this.dependency = dependency;}
}

在上述示例中,MyBean 类的构造方法使用了 @Autowired 注解,告诉 Spring 自动注入 DependencyBean 对象。 自动注入也就是说会创建这个实例

  1. 成员变量注入:在成员变量上使用 @Autowired 注解,Spring 将会自动注入与该成员变量类型匹配的 Bean 对象。
public class MyBean {@Autowiredprivate DependencyBean dependency;
}
  1. Setter 方法注入:
    在 Setter 方法上使用 @Autowired 注解,Spring 将会自动注入与该 Setter 方法参数类型匹配的 Bean 对象。
public class MyBean {private DependencyBean dependency;@Autowiredpublic void setDependency(DependencyBean dependency) {this.dependency = dependency;}
}
  1. 方法注入:在普通方法上使用 @Autowired 注解,Spring 将会自动注入与方法参数类型匹配的 Bean 对象。
public class MyBean {private DependencyBean dependency;@Autowiredpublic void injectDependency(DependencyBean dependency) {this.dependency = dependency;}
}

在上述示例中,MyBean 类的 injectDependency() 方法使用了 @Autowired 注解,告诉 Spring 自动注入与 DependencyBean 类型匹配的 Bean 对象。

举例帮助理解

我们来学习一下上面这部分内容的实际用处,以及为什么这样做

  1. 构造方法注入:
    我们此时面临一个场景,我想要在一个类中使用另一个类的实例,比如说在动物类中,使用鸟类的飞行方法,那么我可以在动物类中创建一个鸟类的引用,通过Autowired注解注入,以达到在此类中实现鸟类的飞行方法。
    如:我定义一个注入的类 三个私有化属性 一个重写的toString方法
@Component
public class DependencyBean {private String name;private Integer age;private String address;@Overridepublic String toString() {return "DependencyBean{" +"name='" + name + '\'' +", age=" + age +", address='" + address + '\'' +'}';}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}
}

使用Autowired注解进行注入

@Component
public class MyBean {private DependencyBean dependency;@Autowired //TODO 这个用法是什么呢?public MyBean(DependencyBean dependency) {this.dependency = dependency;}public String sing(){dependency.setAddress("地球");dependency.setAge(50);dependency.setName("张三");return dependency.toString();}
}

注入之后进行使用

 class Test{public static void main(String[] args) {ApplicationContext applicationContext =new ClassPathXmlApplicationContext("spring-ioc.xml");MyBean bean = applicationContext.getBean(MyBean.class);System.out.println(bean);System.out.println(bean.sing());}
}

结果:我可以不用创建这个注入的类的对象,使用Autowired会自动帮助我创建
在这里插入图片描述
2. 成员变量的注入:其余不改,仅更改MyBean内容

@Component
public class MyBean {@Autowiredprivate DependencyBean dependency;public String sing(){dependency.setAddress("地球");dependency.setAge(50);dependency.setName("张三");return dependency.toString();}
}

我们执行之后得到的结果,可以发现注入的话会自动创建一系列内容。相当于得到了实例

  1. setter方法的注入
@Component
public class MyBean {private DependencyBean dependency;@Autowiredpublic void setDependency(DependencyBean dependency) {this.dependency = dependency;}public String sing(){dependency.setAddress("地球");dependency.setAge(50);dependency.setName("张三");return dependency.toString();}
}

效果一样在这里插入图片描述

  1. 在普通方法上使用
@Component
public class MyBean {private DependencyBean dependency;@Autowiredpublic void injectDependency(DependencyBean dependency) {this.dependency = dependency;}public String sing() {dependency.setAddress("地球");dependency.setAge(50);dependency.setName("张三");return dependency.toString();}
}

结果仍一样在这里插入图片描述
我们需要明白Autowired会根据你规定或者是表明的内容进行注入,从而得到对应的bean对象或者是bean实例。这样做的话简化了操作,让我们实现起来更加的方便。

使用注解实现ioc容器管理

dao层,持久化储存

package com.dao;import com.pojo.Student;import java.util.List;public interface StudentDao {List<Student> queryAll();
}

实现

package com.dao;import com.pojo.Student;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;import java.util.List;
@Repository
public class StudentDaoImpl implements StudentDao{
//    这个位置不可以直接使用注解 需要使用的时 bean的依赖注入@Autowiredprivate JdbcTemplate jdbcTemplate;public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {this.jdbcTemplate = jdbcTemplate;}@Overridepublic List<Student> queryAll() {String sql = "select * from students ";List<Student> students = jdbcTemplate.query(sql,new BeanPropertyRowMapper<>(Student.class));return students;}
}

这里我们主要明确,由于JdbcTemplate这个内容并不是我们创建的,这是根据需求导入的jar包,我们并不清楚它的标注是什么,这里仍然需要配置bean,先创建druid 进行配置后,注入依赖到JdbcTemplate中

<?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:context="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"><context:component-scan base-package="com"/><context:property-placeholder location="classpath:jdbcTemplate.properties"/><bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="url" value="${atguigu.url}"></property><property name="password" value="${atguigu.password}"></property><property name="driverClassName" value="${atguigu.driver}"></property><property name="username" value="${atguigu.username}"></property></bean><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="druidDataSource"/></bean>
</beans>

这样的话,我们先配置号bean对象,当spring扫描的时候,扫描到Autowired的时候,会自动装配。只要保证bean的填写正确,后续的实例spring会帮助进行

Service层

接口
package com.service;import com.pojo.Student;import java.util.List;public interface StudentService {List<Student> queryAll();
}
实现类
package com.service.impl;import com.dao.StudentDaoImpl;
import com.pojo.Student;
import com.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;
@Service
public class StudentsServiceImpl implements StudentService {@Autowiredprivate StudentDaoImpl studentDao;@Overridepublic List<Student> queryAll() {List<Student> students=  studentDao.queryAll();System.out.println("service层的内容"+students);return students;}
}

constroller层内容

package com.Constroller;import com.pojo.Student;
import com.service.impl.StudentsServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;import java.util.List;@Controller
public class StudentsConstroller {@Autowiredprivate StudentsServiceImpl studentsService;public List<Student> findAll(){List<Student> student = studentsService.queryAll();return  student;}
}

代码书写完毕之后,我们需要配置扫描,否则,spring的注解就没有任何效果了。先扫描才可以创建,不扫描的话出现这个错误
在这里插入图片描述

    <context:component-scan base-package="加注解的包名"/>

测试

public class TestIoc {@Testvoid testIoc(){ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-ioc.xml");StudentsConstroller bean = applicationContext.getBean(StudentsConstroller.class);List<Student> studentList =  bean.findAll();System.out.println(studentList);}
}

仍然是老套路,先创建根据配置文件创建ioc容器,创建完成之后,扫描注解进行bean对象的实例,然后执行对应的内容。

怎么执行呢?

通过Autowired进行关联,我们可以将依赖看成不同的模块,A模块调用B怎么调用?,那就是创建B模块的实例,在A中进行使用,而在这个位置,我们是通过注解的形式进行注入,相当于注解的效果是实现B模块的实例
在这里插入图片描述

使用ioc容器获取控制层对象,使用控制层的对象执行后续的内容。

前面我们提到的bean对象的配置,哪里使用的注入是通过指定property的ref进行关联的
在这里插入图片描述
如有错误,请指正。本文的内容来源于尚硅谷2023年ssm视频教程,对文中的内容有进一步补充和讲解。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络相关知识

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览三、相关工具3.1 network profiler/ In…

gRPC 基本原理

基础知识 RPC的语义是远程过程调用&#xff08;Remote Procedure Call&#xff0c;RPC&#xff09;就是将一个服务调用封装在一个本地方法中&#xff0c;让调用者像使用本地方法一样调用服务&#xff0c;对其屏蔽实现细节。 RPC 会给对应的服务接口名生成一个代理类&#xff0c…

[docker] 关于docker的面试题

docker命名空间&#xff1f; docker与虚拟机的区别&#xff1f; 容器虚拟机所有容器共享宿主机的内核每个虚拟机都有独立的操作系统和内核通过namespace实现资源隔离&#xff0c;通过cgroup实现限制资源的最大使用量完全隔离。每个虚拟机都有独立的硬件资源秒级启动速度分钟级…

超越 Node.js:Bun 的创新与突破

1. Bun Bun 是一个全新的 JavaScript 运行时&#xff0c;类似于 Node.js 和 Deno&#xff0c;它专注于提供出色的性能和开发者体验。Bun 的一些特点包括&#xff1a; 快速的性能&#xff1a;Bun 旨在提供高性能&#xff0c;无论是启动时间、执行速度还是安装依赖包的速度。 兼…

使用小米手机

额&#xff0c;因为很久以前的华为荣耀手机&#xff08;虽然现在不是华为了&#xff09;退役了&#xff0c;所以使用了小米手机。 文章目录 小米手机和电脑互联 小米手机和电脑互联 这里我用的ubuntu 22.04 和Redmi note 13 pro。其实开始我也没想到&#xff0c;小米居然可以直…

【3.6数据库系统】数据库备份与恢复技术

目录 1.数据备份1.1备份方式1.2备份类型 2.数据库故障与恢复 1.数据备份 1.1备份方式 △冷备份也称为静态备份&#xff0c;别是将数据库正常关闭&#xff0c;在停止状态下&#xff0c;将数据库的文件全部备份(复制)下来。 △热备份也称为动态备份&#xff0c;是利用备份软件&a…

林浩然的哲学穿越之旅:从道家“道”到柏罗丁的“太一”

林浩然的哲学穿越之旅&#xff1a;从道家“道”到柏罗丁的“太一” Lin Haoran’s Philosophical Journey Across Time: From Dao in Daoism to Plotinus’s “The One” 在这个充满奇思妙想的故事里&#xff0c;我们的主角林浩然可不是个普通的家伙。他是当代的一位哲学侦探&a…

【Java面试】redis

目录 Redis 介绍Reids常用5种数据类型一个字符串类型的值能存储最大容量是多少&#xff1f;Redis 有哪些适合的场景&#xff1f;Redis的并发竞争问题如何解决?什么是缓存穿透&#xff1f;如何避免&#xff1f;什么是缓存雪崩&#xff1f;何如避免&#xff1f;Redis 中设置过期…

Flutter开发进阶之Canvas

Flutter开发进阶之Canvas 在Flutter开发中Canvas作为一个绘制2D图形的工具&#xff0c;提供了一系列绘图方法&#xff0c;可以用来绘制各种形状、线条、文本和图像等&#xff1b; Canvas对象是作为CustomPainter的子组件进行构建的&#xff1b; void paint(Canvas canvas, Si…

(M)unity受伤反弹以及死亡动画

受伤反弹 1.在人物控制脚本中添加受伤后速度将为0&#xff0c;并添加一个反弹的力 在刷新移动时&#xff0c;需要在没有受伤的状态 public bool isHurt; public float hurtForce; private void FixedUpdate() {if(!isHurt)Move(); }public void GetHurt(Transform attacker) …

策略者模式-C#实现

该实例基于WPF实现&#xff0c;直接上代码&#xff0c;下面为三层架构的代码。 目录 一 Model 二 View 三 ViewModel 一 Model using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace 设计模式练…

探索元宇宙的未来:数字人对话系统 - Linly-Talker —— “数字人交互,与虚拟的自己互动”

探索元宇宙的未来&#xff1a;数字人对话系统 - Linly-Talker —— “数字人交互&#xff0c;与虚拟的自己互动” 之前空闲的时候我似乎已经写过了有关于数字人的两篇文章&#xff0c;今天更多的写这篇文章就是想探索一下元宇宙的未来&#xff0c;这种数字人对话系统能做什么&…

Unity - gamma space下还原linear space效果

文章目录 环境目的环境问题实践结果处理要点处理细节【OnPostProcessTexture 实现 sRGB 2 Linear 编码】 - 预处理【封装个简单的 *.cginc】 - shader runtime【shader需要gamma space下还原记得 #define _RECOVERY_LINEAR_IN_GAMMA】【颜色参数应用前 和 颜色贴图采样后】【灯…

【UE5】如何给人物骨骼绑定Control Rig用来制作动画(控制)

本篇文章暂时只教绑定人物手部的Control Rig&#xff0c;脚的Control Rig举一反三即可 1&#xff0c;右键-创建-控制绑定 2在控制绑定中-右键创建基本IK 3&#xff0c;填入上臂-下臂-手 4【手和下臂】右键-新建-Add Controls For Selected&#xff0c;&#xff08;或者新建-…

第十四章 RabbitMQ应用

文章目录 前言1、RabbitMQ概念1.1、生产者和消费者1.2、队列1.3、交换机、路由键、绑定1.3.1、交换机类型 2、RabbitMQ运转流程2.1、生产者发送消息流程2.2、消费者接收消息的过程2.3、AMQP协议 3、RabbitMQ windows安装3.1、下载3.2、安装 4、Spring Boot 整合RabbitMQ4.1、在…

【语录】岁月

中年 写中年&#xff0c;应该是年少励志三千里 踌躇百步无寸功&#xff0c;转眼高堂已白发 儿女蹒跚学堂中&#xff0c;不如意事常八九&#xff0c;可与人言无二三 可是诸位&#xff0c;不用悲伤&#xff0c;稻盛和夫说&#xff0c; 人生并不是一场物质的盛宴&#xff0c;而是…

单片机学习笔记---LCD1602调试工具

LCD1602调试工具 这一节开始之前先说明一下&#xff0c;模块化编程相关的知识&#xff08;就是将代码分成多个文件来写&#xff0c;比如函数的定义放在.c文件中&#xff0c;函数的声明写在.h文件中&#xff09;属于是C语言的内容&#xff0c;学过C语言的伙伴应该都知道。由于这…

Vue2.0+Element实现日历组件

(壹)博主介绍 &#x1f320;个人博客&#xff1a; 尔滨三皮⌛程序寄语&#xff1a;木秀于林&#xff0c;风必摧之&#xff1b;行高于人&#xff0c;众必非之。 (贰)文章内容 1、安装依赖 npm install moment2.29.4 --savenpm install lunar0.0.3 --savenpm install lunar-java…

配置华为交换机生成树VBST案例

知识改变命运&#xff0c;技术就是要分享&#xff0c;有问题随时联系&#xff0c;免费答疑&#xff0c;欢迎联系 厦门微思网络​​​​​​https://www.xmws.cn 华为认证\华为HCIA-Datacom\华为HCIP-Datacom\华为HCIE-Datacom 思科认证CCNA\CCNP\CCIE 红帽认证Linux\RHCE\RHC…

代理IP使用指南:风险与注意事项

在当今的数字化时代&#xff0c;使用在线代理IP已经成为一种常见的网络行为。然而&#xff0c;在使用这些代理IP时&#xff0c;我们需要注意一些风险和问题&#xff0c;以确保我们的网络安全和隐本私文。将探讨使用代理IP时需要注意的几个关键问题。 1、代理IP的安全性 使用代理…