Spring,注解开发

news2024/11/17 9:33:02

Spring是一个轻量级的控制反转(IOC)和面向切面编程(AOP)的框架

1、组成

在这里插入图片描述

spring七大模块详解

2、IOC理论推导

传统的开发 (pojo层、DAO层和业务层)
(1)UserDao
(2) UserDaoImpl
(3) UserService 业务接口
(4) UserServiceImpl 业务实现类
【用户实际调用service层,不需要接触dao层】

UserServiceImpl// 先new一个dao对象
public class UserServiceImpl implements UserService{
	// 方法1:
	private UserDao userdao =new UserDaoImple();
	
	// 方法2:利用接口的思想set注入
	// 优点:
	private UserDao userdao;
	public void setUserDao(UserDao userdao){
		this.userDao = userDao;
	

	// 业务实现
	public void getUser(){
	  userdao.getUser();


测试类:
public class Test{

	// 实例化service对象
	UserService userService = new UserServiceImpl()
	// 利用set动态实现值的注入
	(UserService )userService.setUserDao(new UserDaoImpl)
	userService .getUser();



3、HelloSpring

  • 配置文件applicationconfig.xml
使用Spring创建对象Bean
// Hello hello =new Hello() 
// 相当于new了一个id的实例化变量
    <!-- id:唯一标识符
    class:包名+类型
    name:别名,可同时取多个别名 -->
    
<bean id="变量名" class="类的权限定名" name="name1,name2...">
	<property name=" 属性"  value="属性值"/>
</bean>

基于XML文件的注解配置

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

    <!-- services -->

    <bean id="petStore" class="org.springframework.samples.jpetstore.services.PetStoreServiceImpl">
    // ref:spring容器中的对象  value:具体的值
        <property name="accountDao" ref="accountDao"/>
        <property name="itemDao" ref="itemDao"/>
       
    </bean>


</beans>

// 注解的context名称空间

<!--告知spring在创建容器时要扫描的包,配置所需要的标签不是在beans的约束中,而是一个名称为
    context名称空间和约束中-->
    <context:component-scan base-package="com.itheima"></context:component-scan>


测试类:
// 获取ApplicationContext:拿到spring容器




4、 IOC创建对象的方式

  • 使用无参构造创建对象,默认实现
  • 使用有参构造

<!--方式1:通过类型创建:不建议使用>
<bean id="exampleBean" class="examples.ExampleBean">
    <constructor-arg type="int" value="7500000"/>
    <constructor-arg type="java.lang.String" value="42"/>
</bean>
<!--方式2:通过下标,从0开始>
<bean id="exampleBean" class="examples.ExampleBean">
    <constructor-arg index="0" value="7500000"/>
    <constructor-arg index="1" value="42"/>
</bean>
<!--方式3:参数名>
<bean id="exampleBean" class="examples.ExampleBean">
    <constructor-arg name="years" value="7500000"/>
    <constructor-arg name="ultimateAnswer" value="42"/>
</bean>

5、Spring配置

6、依赖注入

  • 6.1 构造器注入
package x.y;

public class ThingOne {

    public ThingOne(ThingTwo thingTwo, ThingThree thingThree) {
        // ...
    }
}

<beans>
    <bean id="beanOne" class="x.y.ThingOne">
        <constructor-arg ref="beanTwo"/>
        <constructor-arg ref="beanThree"/>
    </bean>

    <bean id="beanTwo" class="x.y.ThingTwo"/>

    <bean id="beanThree" class="x.y.ThingThree"/>
</beans>

  • 6.2 set方式注入
    基于 Setter 的 DI 是通过容器在调用无参数的构造函数或无参数的 static 工厂方法来实例化你的 bean 之后调用 Setter 方法来实现的。
    依赖:bean对象的创建依赖于容器
    注入:bean对象中的所有属性,由容器注入
    【集合】
<bean id="moreComplexObject" class="example.ComplexObject">
    <!-- results in a setAdminEmails(java.util.Properties) call -->
    <property name="adminEmails">
        <props>
            <prop key="name">administrator</prop>
            <prop key="support">support@example.org</prop>
            <prop key="development">development@example.org</prop>
        </props>
    </property>
    
    <!-- List注入:results in a setSomeList(java.util.List) call -->
    <property name="someList">
        <list>
            <value>list1</value>
            <value>list2</value>
            <value>list3</value>
            <ref bean="myDataSource" />
        </list>
    </property>
    
    <!-- results in a setSomeMap(java.util.Map) call -->
    <property name="someMap">
        <map>
            <entry key="an entry" value="just some string"/>
            <entry key="a ref" value-ref="myDataSource"/>
        </map>
    </property>
    
    <!-- results in a setSomeSet(java.util.Set) call -->
    <property name="someSet">
        <set>
            <value>string1</value>
            <value>string2</value>
            <ref bean="myDataSource" />
        </set>
    </property>
</bean>



c命名和p命名空间注入

p命名空间注入:可以直接注入属性的值property
<bean name="classic" class="com.example.ExampleBean">
        <property name="email" value="someone@somewhere.com"/>
    </bean>

    <bean name="p-namespace" class="com.example.ExampleBean"
        p:email="someone@somewhere.com"/>


c命名空间注入:通过构造器注入
<!-- traditional declaration with optional argument names -->
    <bean id="beanOne" class="x.y.ThingOne">
        <constructor-arg name="thingTwo" ref="beanTwo"/>
        <constructor-arg name="thingThree" ref="beanThree"/>
        <constructor-arg name="email" value="something@somewhere.com"/>
    </bean>

    <!-- c-namespace declaration with argument names -->
    <bean id="beanOne" class="x.y.ThingOne" 
    c:thingTwo-ref="beanTwo"
    c:thingThree-ref="beanThree" 
    c:email="something@somewhere.com"/>


注意:p命名和c命名需要导入xml约束

xmlns:c="http://www.springframework.org/schema/c"
xmlns:p="http://www.springframework.org/schema/p"

bean的作用域

在这里插入图片描述

7、Bean自动装配

  • 自动装配是spring满足bean依赖一种方式
  • Spring在上下文中自动寻找,
  • spring中有三种装配方式
    1、在xml中显示配置
    2、在java中显示配置
    3、隐式的自动装配bean重要!!!
    <!--
     byName:会自动在容器上下本中查找,和自己对象set方法后面的值对应的beanid 
     如setDog 中的dog对应的beanid
 
     -->
    <bean id="people" class="com.gt.pojo.People" autowire="byName">
        <property name="name" value="hello"/>
    </bean>
 //<property name="dog" ref="dog"/> 
// <property name="cat" ref="cat"/> = =  autowire="byName"

<!--
     byType:会自动在容器上下本中查找,和自己对象属性类型相同的bean
     -->
 <bean id="people" class="com.gt.pojo.People" autowire="byType">
        <property name="name" value="hello"/>
    </bean>

1、byName:保证所有bean的id唯一,并且这个bean需要和自动注入的属性的set方法值一致
2、byType:保证所有bean的class唯一,并且这个bean需要和自动注入的属性类型一致

8、使用注解实现自动装配

(1)导入约束,context约束
(2)配置注解的配置(开启注解)context:annotation-config/

<?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
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">

<!--  开启注解的支持-->
    <context:annotation-config/>


   <bean id="cat" class="com.gt.pojo.Cat"/>
    <bean id="dog" class="com.gt.pojo.Dog"/>
    <bean id="people" class="com.gt.pojo.People"/>
</beans>

使用@Autowired
1、@Autowired 应用于字段

@Autowired
    private MovieCatalog movieCatalog;

2、应用于传统的setter方法

  private MovieFinder movieFinder;
    @Autowired
    public void setMovieFinder(MovieFinder movieFinder) {
        this.movieFinder = movieFinder;
    }

3、使用@Autowired可以不写set(),前提是自动装配的属性在IOC容器中存在,且符合byName

【扩展:】
@Nullable

public class SimpleMovieLister {
// Nullable 可以为null值

    @Autowired
    public void setMovieFinder(@Nullable MovieFinder movieFinder) {
        ...
    }
}


@Primary
当多个Bean自动注入到一个单值依赖的候选者时,优先考虑一个特定的Bean
例子:

@Configuration
public class MovieConfiguration {

    @Bean
    @Primary
    public MovieCatalog firstMovieCatalog() { ... }

    @Bean
    public MovieCatalog secondMovieCatalog() { ... }

    // ...
}

下面的 MovieRecommender 被自动注入到 firstMovieCatalog
public class MovieRecommender {

    @Autowired
    private MovieCatalog movieCatalog;

    // ...
}


@Qualifier
如果@Autowired自动装配环境较复杂,使用

  • @Qualifier(value=“”)去配置@Autowired使用,指定一个唯一的bean对象注入
    <bean id="cat1" class="com.gt.pojo.Cat"/>
    <bean id="cat2" class="com.gt.pojo.Cat"/>
    <bean id="dog1" class="com.gt.pojo.Dog"/>
    <bean id="dog2" class="com.gt.pojo.Dog"/>
    <bean id="people" class="com.gt.pojo.People"/>
public class People {
    private String name;
    /**
     * 如果显式定义了Autowired的required属性为false,说明这个对象可以为null,否则不允许为空
     * @Autowired是根据类型自动装配的,加上@Qualifier则可以根据byName的方式自动装配
     * @Qualifier不能单独使,与@Autowired配合
     */
    @Autowired(required = false)
    @Qualifier(value = "dog1")
    private Dog dog;
    @Autowired
    @Qualifier(value = "cat1")
    private Cat cat;
}

@Resource 注入
通过在字段或Bean属性设置方法上使用@Resource注解进行注入

public class People {
    private String name;
    
    @Resource(name = "dog1")
    private Dog dog;
    
    @Resource(name = "cat")
    private Cat cat;
}

<bean id="cat" class="...Cat"/>
<bean id="dog" class="...Dog"/>
<bean id="person" class="...Perple"/>

// 或者名字不一样,但是class类型唯一
<bean id="cat111" class="...Cat"/>
<bean id="dog222" class="...Dog"/>

@Resource默认通过byName方式实现,如果找不到名字,则通过byType实现,如果两者都找不到就报错~

@Autowired通过byType实现

9、使用注解开发

@Component

// 等价于<bean id="user" class="...User"/>
@Component 
public class User {
	private String name ="xiexie"
 
}

@Value

@Value("xiexie")
private String name;

2、属性如何注入

@Component 
public class User {
	private String name;

// 等价于  <property name="name" value="xiexie2"/>
	@Value("xiexie2")
	public void setName(string name){
		this.Name = name;
	}
 
}

3、衍生注解,MVC三层架构
@Component

  • dao 【@Repository】
  • sevice 【@service】
  • controller 【@Controller】
    这四个注解都表示将某个类注册到Spring中,装配Bean
为了自动检测这些类并注册相应的Bean,你需要在你的 @Configuration 类中添加 @ComponentScan,其中 basePackages 属性是这两个类的共同父包

指定要扫描的包,包下的注解就会生效
 <context:component-scan base-package="org.example"/>

// 注解
使用注解的 value 属性(即 @ComponentScan("org.example")

9、基于java的容器配置(springboot常见)

在java代码中使用注解来配置Spring容器

Spring的Java配置支持的核心工件是 @Configuration 注解的类和 @Bean 注解的方法。

建立一个config目录,

@Configuration
@ComponentScan(basePackages = "com.example") // 启用组件扫描
@import(AppConfig2.class)// 导入其他的config文件
public class AppConfig {

// 注册一个bean,相当于<bean/>
// 方法名相当于beanid,
// 方法返回值相当于class
    @Bean
    public MyServiceImpl myService() {
    // 返回要注入的对象
        return new MyServiceImpl();
    }
}

等同于Spring <beans/> XML
<beans>
    <bean id="myService" class="com.acme.services.MyServiceImpl"/>
</beans>


** 通过使用 AnnotationConfigApplicationContext实例化Spring容器**


测试类:
public static void main(String[] args) {
    ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
    MyService myService = ctx.getBean(MyService.class);
    myService.doStuff();
}


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

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

相关文章

天狼星-大熊座 Ursa Major SIRIUS

大熊座 Ursa Major SIRIUS 键盘说明 客制化键盘&#xff1a; 大熊座 Ursa Major SIRIUS 配列&#xff1a; 75 键帽&#xff1a;KCA-HelloWorld-Black 双模&#xff1a; 蓝牙-分裂方案 驱动配置&#xff1a;Link Lab 驱动设置软件 键盘操作 键盘说明参考&#xff1a;键位配…

利用WinDbg查看堆栈中方法入参的值4(C#)

由于作者水平有限&#xff0c;如有写得不对的地方&#xff0c;请指正。 使用WinDbg的过程中&#xff0c;坑特别的多&#xff0c;对版本要求比较严格&#xff0c;如&#xff1a; 1 32位应用程序导出的Dump文件要用32位的WinDbg打开&#xff0c;想要没有那么多的问题&#xf…

海底光缆位置探测技术的应用概述

1. 概述 海底光缆运行在地质环境复杂的海洋环境中&#xff0c;地震、海床塌陷、滑坡、洋流变化、海洋生物及船只抛锚都有可能造成光缆断裂、破损&#xff0c;影响光缆的安全运行。海底光缆一旦遭受损坏&#xff0c;其造成的经济损失无法估量。因此在海洋开发工程实施前&#xf…

Web转化为APP——YonBIP(APICloud迁移版)

目录 平台注册 平台使用 设计封面&#xff08;端设置&#xff09; APP证书 代码上传 移动打包 运营管理和移动插件 众所周知&#xff0c;APP开发是一件非常麻烦的事&#xff0c;很多擅长Web开发的人未必擅长APP开发。那么作为一个Web开发者&#xff0c;可不可以有很方便…

基于prefix tuning + Bert的标题党分类器

文章目录 背景一、Prefix-Tuning介绍二、分类三、效果四、参阅 背景 近期, CSDN博客推荐流的标题党博客又多了起来, 先前的基于TextCNN版本的分类模型在语义理解上能力有限, 于是, 便使用的更大的模型来优化, 最终准确率达到了93.7%, 还不错吧. 一、Prefix-Tuning介绍 传统的…

Redis之Redisson原理详解

文章目录 1 Redisson1.1 简介1.2 与其他客户端比较1.3 操作使用1.3.1 pom.xml1.3.2 配置1.3.3 启用分布式锁 1.4 大致操作原理1.5 RLock1.5.1 RLock如何加锁1.5.2 解锁消息1.5.3 锁续约1.5.4 流程概括 1.6 公平锁1.6.1 java中公平锁1.6.2 RedissonFairLock1.6.3 公平锁加锁步骤…

50 Projects 50 Days - Form Input Wave 学习记录

项目地址 Form Input Wave 展示效果 Form Input Wave 实现思路 简单的登陆界面结构&#xff0c;只是在输入框聚焦时标题提示文字会有一个字母逐渐向上跳动的动画效果&#xff0c;这需要针对每个字符单独设置变换的延时&#xff0c;可以考虑在JavaScript中处理这部分逻辑&am…

2017~2018学年《信息安全》考试试题(A1卷)

北京信息科技大学 2017 ~2018 学年第二学期《信息安全》考试试题 (A 卷) 课程所在学院:计算机学院 适用专业班级:计科 1504-6、重修 考试形式:闭卷 一、单选题(本题满分 20 分&#xff0c;共含 10 道小题&#xff0c;每小题 2 分) 网络安全是指网络系统的硬件、软件及( C )的…

【头歌-Python】Python第九章作业(初级)第5关

第5关&#xff1a;绘制程序设计语言饼图 任务描述 列表labels和sizes中的数据分别是目前主流程序设计语言及其热度数据&#xff08;百分比&#xff09;&#xff0c;请根据这些数据绘制饼图&#xff0c;并将Python程序设计语言所在区域突出0.1显示。 labels [C语言, Python…

Java ~ Reference ~ ReferenceQueue【总结】

前言 文章 相关系列&#xff1a;《Java ~ Reference【目录】》&#xff08;持续更新&#xff09;相关系列&#xff1a;《Java ~ Reference ~ ReferenceQueue【源码】》&#xff08;学习过程/多有漏误/仅作参考/不再更新&#xff09;相关系列&#xff1a;《Java ~ Reference ~ …

一篇就能学懂的散列表,让哈希表数据结构大放光彩

目录 1.散列表的基本概念 2.散列表的查找 3.散列函数的构造方法 1.直接定址法 2.除留余数法 4.散列表解决冲突的方法 1.开放定址法 2.链地址法 1.散列表的基本概念 基本思想&#xff1a;记录的存储位置与关键字之间存在的对应关系 对应关系——hash函数 Loc(i) H(k…

关于外包被开要怎么维护自己的权益

我一直以为外包被开都是没有任何赔偿的&#xff0c;之前网上对于外包的消息都是说&#xff0c;没有任何赔偿或者是怕麻烦然后就干脆放弃了的各种评论。。。但是最近我在问到一个朋友的时候&#xff0c;他很好的维护了自己的权益。最后获得了N1 保留证据 当被告知外包需要你离场…

牛客网语法篇刷题(C语言) — 运算

作者主页&#xff1a;paper jie的博客_CSDN博客-C语言,算法详解领域博主 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 本文录入于《C语言-语法篇》专栏&#xff0c;本专栏是针对于大学生&#xff0c;编程小白…

单链表OJ题:LeetCode--138.复制带随即指针的链表

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下LeetCode中第138道单链表OJ题&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; 数据结构与算法专栏&#xff1a;数据结构与算法 个 人…

python使用Faker库进行生成模拟mock数据(基本使用+五个小案例)

使用faker进行生成模拟(mock))数据 文章目录 使用faker进行生成模拟(mock))数据一、Faker库安装二、Faker库基本介绍三、案例1&#xff1a;Faker库生成核酸数据四、案例2&#xff1a;生成不重复的人名和地名五、案例3&#xff1a;生成有时间期限的低保数据六、案例4&#xff1a…

01-Vue 项目环境搭建和创建准备工作

一. 学习目标 掌握 Vue 项目创建的依赖环境掌握 Vue 项目创建过程 二. 学习内容 掌握搭建 Vue 项目准备环境掌握 Vue 项目创建过程了解 Vue 项目各子目录 三. 学习过程 1. 准备工作 &#xff08;1&#xff09;安装Node.js 打开node.js官网&#xff1a;Node.js &#xff0…

【状态估计】无迹卡尔曼滤波(UKF)应用于FitzHugh-Nagumo神经元动力学研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

详解ASP.NET Core 在 IIS 下的两种部署模式

KestrelServer最大的优势体现在它的跨平台的能力&#xff0c;如果ASP.NET CORE应用只需要部署在Windows环境下&#xff0c;IIS也是不错的选择。ASP.NET CORE应用针对IIS具有两种部署模式&#xff0c;它们都依赖于一个IIS针对ASP.NET CORE Core的扩展模块。 一、ASP.NET CORE C…

UML类图入门

UML类图入门 UML是一个通用的可视化建模描述语言&#xff0c;通过图形符号和文字来对系统进行建模。适用于各种软件的开发方法、生命周期的各个阶段。 类的UML图示 类使用包含类型、属性和操作&#xff08;方法&#xff09;且带有分割线的长方形来表示&#xff0c;如&#x…

人际关系的学习改进

表达的目的&#xff1a;让别人对你感兴趣 不要有苦劳而无功劳 爱的五种语言&#xff1a;表达爱的语言 人类存在的中心&#xff0c;是渴望和人亲近&#xff0c;被人所爱。婚姻即是被设计满足这种亲密关系和爱的需求的&#xff1b;把注意力集中在情绪健康所需的那片爱土上&…