spring框架:简介+依赖注入

news2024/9/24 5:23:24

目录

一、spring简介

二、创建项目

三、spring创建对象 

四、SpringBean管理

1.注入实现-XML

2.注入实现-注解


一、spring简介

        spring诞生与2003年,是一个轻量级的、IOC( Inversion Of Control 控制反转)和AOP(Aspect Oriented Programming 面向切面编程)的java开发框架,为了简化企业级应用开发。

二、创建项目

1.Maven导入spring核心基础jar包

        添加spring-context jar包

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.2.RELEASE</version>
        </dependency>

2.编写spring配置文件

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

</beans>

三、spring创建对象 

 1.在bean添加spring框架需要管理的类:

        如下class为类地址,id为唯一标识  

<bean id="user" class="com.yyds.spring.bean.User" scope="prototype"></bean>

        设置bean中的scope:

        singleton:只创建一个bean对象,在启动spring时创建(默认形式)

        prototype:在每次获取对象时创建,创建新的bean对象

2.启动spring:

        spring.xml为spring的配置文件(含有约束和管理的类)

 ApplicationContext applicationContext= new ClassPathXmlApplicationContext("spring.xml");

创建对象:其中参数user为bean管理类的id,第二个参数为该类的Class对象,我们让spring帮我们创建了对象,把创建对象的控制权限交给了spring框架,再也不用new对象,这就是IOC“反转控制”的思想。

        User user =  applicationContext.getBean("user", User.class);
        System.out.println(user);

IOC 底层实现方式: 解析 xml/扫描注解标签 + 工厂模式 + 反射机制

四、SpringBean管理

依赖注入:创建对象时,需要为对象的属性进行赋值。

注入方式:

        set方法

        构造方法

1.注入实现-XML

        set方法 :name 为属性名,value为值

    <bean id="user2" class="com.yyds.spring.bean.User" scope="prototype">
        <!--为属性赋值 通过set方法-->
        <property name="id" value="100"></property>
        <property name="name" value="张三"></property>
    </bean>

        构造方法:name 为构造方法的参数名,value为传入参数的值

    <bean id="user3" class="com.yyds.spring.bean.User" scope="prototype">
       <!-- 通过构造方法-->
        <constructor-arg name="id" value="12"></constructor-arg>
        <constructor-arg name="name" value="李四"></constructor-arg>
    </bean>

 属性含有对象时:

        例如:UserService类中含有userDao对象,有userDao的set方法,实现对userDao中方法的调用:

public class UserService {
    UserDao userDao;

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    public void insert(User user) {
        userDao.insertUser(user);
    }
}

UserDao类

public class UserDao {
    public void insertUser(User user){
        System.out.println("保存成功");
    }
}

XML如下,与为简单属性赋值的方式有一点不同,在property标签中的value要改为ref,表示引用此id的类:

测试:

public class TestUser{
    @Test
    public void test1(){
        //启动spring
        ApplicationContext applicationContext= new ClassPathXmlApplicationContext("spring.xml");
        //spring创建user对象作userService.insert方法的为参数
        User user =  applicationContext.getBean("user3", User.class);
        System.out.println(user);
        //spring创建userService对象并创建属性为UserDao的对象
        UserService userService =  applicationContext.getBean("userService", UserService.class);
        userService.insert(user);
    }
}

输出结果:

 

2.注入实现-注解

        开启注解扫描:

                在spring的xml配置文件中配置:此处配置的为需要扫描的包,包含里面所有的类

<context:component-scan base-package="com.yyds.spring"></context:component-scan>

        添加约束:

        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd

添加后的spring.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"
       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
        http://www.springframework.org/schema/context/spring-context.xsd
       ">

    <context:component-scan base-package="com.yyds.spring"></context:component-scan>

</beans>

 相关注解:

实现创建对象功能:
@Component(value=“user”)等于<bean id=“user” class=“”></bean>
@Service:通常添加到Service层的类名之上
@Repository:通常添加到Dao层的类名之上
Scope设置:
@Scope(value=“prototype”) 原型
@Scope(value=“ singleton ”) 单例

依赖注入:

  1.         @Autowired可以放在属性上,就可以不用set方法,通过属性的类型在spring容器中寻找
  2.         @Autowired @Qualifier 联合使用,要用标识:value=" ";
  3.         @Resource可以通过类型和标识找,有无name=“ ”都可以。

 @Autowired和@Qualifier是spring框架提供的,@Resource是JDK提供的。

示例: 

@Service
public class UserService {
    @Resource
    UserDao userDao;

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    public void insert(User user) {
        userDao.insertUser(user);
    }
}
@Repository
public class UserDao {
    public void insertUser(User user){
        System.out.println("保存成功");
    }
}
public class Test {
    @Test
    public void test1(){
        //启动spring
        ApplicationContext applicationContext= new ClassPathXmlApplicationContext("spring.xml");
        User user1 =  applicationContext.getBean("user", User.class);
        UserService userService = applicationContext.getBean(UserService.class);
        userService.insert(user1);
    }
}

 输出结果:

 

 

 

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

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

相关文章

linux挂载内网镜像源文件,支持yum安装

cd /etc/yum.repos.d/vim kylin_aarch64.repo 重建yum缓存 yum clean allyum makecacheyum repolist

【vue】实现高性能虚拟滚动的Vue代码解析

在前端开发中&#xff0c;当需要展示大量数据时&#xff0c;如何保持页面的流畅性是一个挑战。传统的滚动方式会将所有数据一次性渲染到页面&#xff0c;这可能导致页面加载缓慢甚至崩溃。而虚拟滚动技术能够解决这个问题&#xff0c;它只渲染可视区域内的数据&#xff0c;从而…

Vue2向Vue3过度Vuex核心概念actions

目录 1 核心概念 - actions1.定义actions2.组件中通过dispatch调用 2 辅助函数 -mapActions 1 核心概念 - actions state是存放数据的&#xff0c;mutations是同步更新数据 (便于监测数据的变化, 更新视图等, 方便于调试工具查看变化)&#xff0c; actions则负责进行异步操作 说…

用Python写一个武侠游戏

前言 在本教程中&#xff0c;我们将使用Python写一个武侠类的游戏&#xff0c;大的框架全部搭好了&#xff0c;很多元素都可以自己添加&#xff0c;让游戏更丰富 &#x1f4dd;个人主页→数据挖掘博主ZTLJQ的主页 个人推荐python学习系列&#xff1a; ☄️爬虫JS逆向系列专栏 -…

PHP自己的框架cookie()使用(完善篇七)

1、PHP自己的框架cookie() 2、cookie类&#xff08;CookieBase.php&#xff09; <?php class CookieBase {/*** 设置cookie*/public static function set($name, $value, $expire 3600, $path , $domain , $secure false, $httponly false) {setcookie($name, $valu…

Verilog 实现超声波测距

Verilog 实现超声波测距 教学视频&#xff1a; https://www.bilibili.com/video/BV1Ve411x75W?p33&spm_id_frompageDriver&vd_source19ae31dff4056e52d2729a4ca212602b 超声波测距原理 参考资料&#xff1a;STM32的超声波测距程序_超声波测距stm32程序_VaderZhang的…

cs231n assignment3 q5 Self-Supervised Learning for Image Classification

文章目录 嫌墨迹直接看代码Q5 Self-Supervised Learning for Image Classificationcompute_train_transform CIFAR10Pair.__getitem__()题面解析代码输出 simclr_loss_naive题面解析代码输出 sim_positive_pairs题面解析代码输出 compute_sim_matrix题面解析代码输出 simclr_lo…

37、springboot 为 spring mvc 提供的自动配置及对自动配置的一些自定义定制(大体思路)

springboot 为 spring mvc 提供的自动配置及对自动配置的一些自定义定制&#xff08;大体思路&#xff09; ★ Spring Boot主流支持两个MVC框架&#xff1a; Spring MVC&#xff08;基于Servlet&#xff09; Spring WebFlux&#xff08;基于Reactive&#xff0c;属于响应式AP…

开源双语对话语言模型 ChatGLM-6B 本地私有化部署

本文首发于&#xff1a;https://www.licorne.ink/2023/08/llm-chatglm-6b-local-deploy/ ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型&#xff0c;基于 General Language Model (GLM) 架构&#xff0c;具有 62 亿参数。结合模型量化技术&#xff0c;用户可以在消费级…

人员跌倒检测识别预警

人员跌倒检测识别预警系统通过pythonopencv深度学习网络模型架构&#xff0c;人员跌倒检测识别预警系统实时监测老人的活动状态&#xff0c;通过图像识别和行为分析算法&#xff0c;对老人的姿态、步态等进行检测和识别&#xff0c;一旦系统检测到跌倒事件&#xff0c;立即发出…

Vue2向Vue3过度Vuex核心概念state状态

目录 1 核心概念 - state 状态1.目标2.提供数据3.访问Vuex中的数据4.通过$store访问的语法5.代码实现5.1模板中使用5.2组件逻辑中使用5.3 js文件中使用 2 通过辅助函数 - mapState获取 state中的数据1.第一步&#xff1a;导入mapState (mapState是vuex中的一个函数)2.第二步&am…

Dubbo—流量管控

此任务基于一个简单的线上商城微服务系统演示了 Dubbo 的流量管控能力。 线上商城的架构图如下&#xff1a; 系统由 5 个微服务应用组成&#xff1a; Frontend 商城主页&#xff0c;作为与用户交互的 web 界面&#xff0c;通过调用 User、Detail、Order 等提供用户登录、商品…

为什么使用Nacos而不是Eureka(Nacos和Eureka的区别)

文章目录 前言一、Eureka是什么&#xff1f;二、Nacos是什么&#xff1f;三、Nacos和Eureka的区别3.1 支持的CAP3.2连接方式3.3 服务异常剔除3.4 操作实例方式 总结 前言 为什么如今微服务注册中心用Nacos相对比用Eureka的多了&#xff1f;本文章将介绍他们之间的区别和优缺点…

推荐前 6 名 JavaScript 和 HTML5 游戏引擎

推荐&#xff1a;使用 NSDT场景编辑器 助你快速搭建3D应用场景 事实是&#xff0c;自从引入JavaScript WebGL API以来&#xff0c;现代浏览器具有直观的功能&#xff0c;使它们能够渲染更复杂和复杂的2D和3D图形&#xff0c;而无需依赖第三方插件。 你可以用纯粹的JavaScript开…

Nuxt3打包部署到Linux(node+pm2安装和运行步骤+nginx代理)

最近&#xff0c;我们项目组的工作接近尾声&#xff0c;需要把项目部署上线。由于前端第一次使用Nuxt3框架&#xff0c;后端也是第一次部署Nuxt3项目&#xff0c;所以刚开始出现了很多问题。在我上网搜索很多教程后&#xff0c;得到了基本的流程。 1.服务器安装node.js环境 N…

Linux常用命令_文件搜索命令

文章目录 1. 文件搜索命令find2. 其他搜索命令2.1 文件搜索命令&#xff1a;locate2.2 文件搜索命令&#xff1a;which2.3 文件搜索命令&#xff1a;whereis2.4 文件搜索命令&#xff1a;grep 1. 文件搜索命令find 2. 其他搜索命令 2.1 文件搜索命令&#xff1a;locate 作为f…

c语言练习题30:判断一个数是否为2^n

判断一个数是否为2^n 思路&#xff1a;2^n中只有一个1故可以通过n&(n-1)是否为0来判断。 代码&#xff1a;

Android 之 WindowManager (窗口管理服务)

本节引言&#xff1a; 本节给大家带来的Android给我们提供的系统服务中的——WindowManager(窗口管理服务)&#xff0c; 它是显示View的最底层&#xff0c;Toast&#xff0c;Activity&#xff0c;Dialog的底层都用到了这个WindowManager&#xff0c; 他是全局的&#xff01;该类…

用MFC打开外部程序

在MFC&#xff08;Microsoft Foundation Classes&#xff09;中&#xff0c;你可以使用ShellExecute函数来打开Notepad并加载指定的文件。ShellExecute函数是Windows API的一部分&#xff0c;它可以执行与操作系统相关的操作&#xff0c;例如打开文件、运行程序等。 以下是在M…

VBJSON报错:缺少:语句结束

项目中使用JSON库VBJSON时报错&#xff1a; 编译错误&#xff1a;缺少&#xff1a;语句结束 cJSONScript和cStringBuilder报相同的错误&#xff0c;都在第一行: VERSION 1.0 CLASS 研究了半天没啥结果&#xff0c;之前使用这个库的时候没有什么问题&#xff0c;所以判定是当前…