前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring入门

Spring入门

作者头像
Cikian.
发布2023-08-09 19:09:13
1400
发布2023-08-09 19:09:13
举报
文章被收录于专栏:Cikian技术站

Spring入门

一、IoC(Inversion of Control)控制反转

1. 基本概念:

  1. IoC(Inversion of Control)控制反转 使用对象时,由主动new产生对象转换为由外部提供对象,此过程中对象创建的控制权由程序转移到外部,此思想称为控制反转。 Spring技术对IoC思想进行了实现:
    • Spring提供了一个容器,称为IoC容器,用来充当IoC思想中的外部
    • IoC容器负责对象的创建、初始化等一系列工作,被创建或被管理的对象在IoC容器中统称为Bean
  2. DI(Dependency Injection)依赖注入 在容器中建立bean与bean之间的依赖关系的整个过程,称为依赖注入

2. 核心概念

  1. 目标:充分解耦
    • 使用IoC容器管理bean(IoC)
    • 在IoC容器内将有依赖关系的bean进行关系绑定(DI)
  2. 最终效果:
    • 使用对象时不仅可以直接从IoC容器中获取,并且获取到的bean已经绑定了所有的依赖关系

二、入门案例

1. IoC

pom.xml导入spring坐标

代码语言:javascript
复制
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.2.10.RELEASE</version>
</dependency>

创建spring配置文件applicationContext.xml

代码语言:javascript
复制
<?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">

<!--    1. 导入坐标-->

<!--    2. 配置bean-->
    <bean id="bookDao" class="org.example.dao.impl.BookDaoImpl" />
    <bean id="bookService" class="org.example.service.impl.BookServiceImpl" />
</beans>

实现

代码语言:javascript
复制
package org.example;
import org.example.dao.BookDao;
import org.example.service.BookService;
import org.example.service.impl.BookServiceImpl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {
    public static void main(String[] args) {
        // 获取IoC容器
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        // 从容器中获取对象
        BookDao bookDao = (BookDao) context.getBean("bookDao");
        // 调用方法
        bookDao.save();
        BookService bookService = (BookService) context.getBean("bookService");
        bookService.save();
    };
};

2. DI

使用setter注入

代码语言:javascript
复制
<?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">

    <bean id="bookDao" class="org.example.dao.impl.BookDaoImpl"/>
    <bean id="userDao" class="org.example.dao.impl.UserDao"/>
    <bean id="bookService" class="org.example.service.impl.BookServiceImpl" autowire="byType">
        <property name="bookDao" ref="bookDao"/>
        <property name="userDao" ref="userDao"/>
    </bean>

</beans>
代码语言:javascript
复制
public class BookServiceImpl implements BookService {
    private BookDao bookDao;
    private UserDao userDao;

    public BookServiceImpl(BookDao bookDao) {
        this.bookDao = bookDao;
    };

    public BookServiceImpl() {
    };
    
    // setter方法
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    };

    public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    };

    public void save(){
        System.out.println("Service层调用Dao层的方法...");
        bookDao.save();
        userDao.save();
    };

};

使用setter注入时,需要给每一个依赖项设置setter方法,配置文件中的 <property> 坐标中name属性的值实为setter方法的变量名,如:setter方法为 public void setBookDao(),则name属性的值为bookDao。ref属性的值为一个bean,所以需要注入的bean首先要配置bean。

如果是基本数据类型和String,则不用ref属性,改为value属性。

构造器注入

代码语言:javascript
复制
<?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">

    <bean id="bookDao" class="org.example.dao.impl.BookDaoImpl"/>
    <bean id="userDao" class="org.example.dao.impl.UserDao"/>
    <bean id="bookService" class="org.example.service.impl.BookServiceImpl" autowire="byType">
        <constructor-arg ref="bookDao"/>
        <constructor-arg ref="userDao"/>
    </bean>
</beans>

使用构造器注入时,需要有相应的构造方法,如在bookServiceImpl类中,应该有 public BookServiceImpl(BookDao bookDao, UserDao userDao) 构造方法,同时在配置文件中,应用 <constructor-arg> 标签,其属性与 <property> 基本类似。

自动装配

<bean id="bookService" class="org.example.service.impl.BookServiceImpl" autowire="byType"> 在bean标签中添加 autowire 属性,即可实现自动装配。其中byType为按类型装配,常用的还有byName按照名字自动装配。

三、容器相关

1. 获取容器的方式

  1. 类路径加载配置文件 ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
  2. 文件路径加载配置文件 ClassPathXmlApplicationContext ctx = new FileSystemXmlApplicationContext("D:\\applicationContext.xml");
  3. 加载多个配置文件 ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("a1.xml","a2.xml");

2. Tips

  • BeanFactory是Ioc容器的顶层接口,初始化BeanFactory对象时,bean为延迟加载
  • ApplicationContext接口时Spring容器的核心接口,初始化时bean立即加载
  • ApplicationContext接口提供基础的bean操作相关方法,通过其他接口扩展其功能
  • ApplicationContext接口常用初始化类:
    1. ClassPathXmlApplicationContext
    2. FileSystemXmlApplicationContext

四、bean相关

1. 配置

代码语言:javascript
复制
<bean id="bookDao"
      name="bd BD"
      class="dao.impl.BookDaoImpl" 
      scope="singleton" 
      init-method="init"
      destroy-method="destroy"
      autowire="byType"
      factory-method="getInstance"
      factory-bean="factory.BookDaoFactory"
      lazy-init="true"
      />
<!--
    依次对应:
    bean的ID
    bean的别名
    bean类型,静态工厂类,FactoryBean类
    控制bean的实例化数量(单例、非单例)
    生命周期初始化方法
    生命周期销毁方法
    自动装配类型
    bean工厂方法,应用于静态工厂或实例工厂
    实例工厂bean
    控制bean是否延迟加载
-->

2. 获取bean的方式

  1. 使用bean名称 BookDao bookDao = (BookDao) ctx.getBean("bookDao");
  2. 使用bean名称并指定类型 BookDao bookDao = ctx.getBean("bookDao", BookDao.class);
  3. 使用bean类型获取 BookDao bookDao = ctx.getBean(BookDao.class);

五、依赖注入相关

1. 配置

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-08-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Spring入门
    • 一、IoC(Inversion of Control)控制反转
      • 1. 基本概念:
      • 2. 核心概念
    • 二、入门案例
      • 1. IoC
      • 2. DI
    • 三、容器相关
      • 1. 获取容器的方式
      • 2. Tips
    • 四、bean相关
      • 1. 配置
      • 2. 获取bean的方式
    • 五、依赖注入相关
      • 1. 配置
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档