spring框架 快速入门

2023-05-16

Spring是什么

Spring是一款开源的免费框架,是分层的javaSE/EE 应用full-stack轻量级开源框架,以IIoc(Inverse Of Control:反转控制)和Aop(Aspect Oriented Programming:面向切面编程)为内核,提供了展现层SpringMVC 和持久层SpringJDBC以及业务事务管理等众多的企业级应用技术。

优势

  1. 方便解耦 ,由Spring提供的Ioc容器,将对象间的依赖关系由Spring进行控制。由Ioc容器进行注入和实例化,避免硬编码造成过分程序耦合。用户不必为属性配置文件解析,单例模式类等,关注上层代码应用以及更加容易维护代码。
  2. Aop编程支持,OOP传统难实现功能,可以通过面向切面的编程轻松实现。;
  3. 声明式事务的支持 ,不需再写重复冗余的事务管理代码,通过声明方式灵活的进行事务管理,提高开放效率;
  4. 方便集成各种优秀框架 ,Spring可以降低各种框架的使用难度,提供Struts2、Hibernate、Mybatis 等支持

Ioc的目的和作用

先了解什么是程序的耦合
	耦合性(Coupling),也叫耦合度。耦合的强弱决定于模块间的调用和传入数据方式等关系复杂量。模块间的耦合度是指模块之间依赖关系,包括控制控制关系,调用关系,数据传递关系。关系越多,模块间的耦合向越高,其独立性就越差,我们对代码维护成本就越高。
	eg:强耦代码:	
public class A {
    public void say() {
        System.out.println("I am A");
    }
}
public class B {
    public void put(A a) {
        a.say();
    }
}

eg:弱耦合性

public interface IBase {
    void say();
}
public class A implements IBase {
    @Override
    public void say() {
        System.out.println("I am A");
    }
}
public class B implements IBase {
    @Override
    public void say() {
        System.out.println("I am B");
    }
}
public class C {
    public void put(IBase base) {
        base.say();
    }
}

也是面向接口式编程思想,解耦

控制反转-Inversion Of Control

一般我们在获取对象是都是才自己new 对象方式
在这里插入图片描述
代码量上去,就不容易维护 ,以及耦合性问题。
在这里插入图片描述
把创建对象的权利交给了Ioc 容器,我需要对象,就找Ioc 提供。我与对象不再是直接关系,变成间接关系,消减程序代码中耦合。

Ioc容器配置

基于Xml配置

1.在类的根路径创建一个不是中文名的xml文件
2.给配置文件导入约束

<?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">

3.让spring管理资源,在配置文件中配service和dao

<--!
bean标签:用于配置让spring创建对象,并存入Ioc容器
id属性:对象的唯一标识
class属性:指定要创建对象的全限定类名,用于反射创建对象。默认情况无参构造
scope:指定对象的作用范围 
			singleon:同一个bean 创建同一对象
			prototype:同一个bean 每次创建是不同对象
			request :web项目中,Spring创建一个bean 存入request域中
			session:web项目中,spring创建一个备案存入session中
init-method:指定类中初始化方法名称
destroy-method指定勒种销毁方法名称
-->
<bean id="userServiceImp" class="com.woniu.service.imp.UserServiceImp" scope=“singleon”>
    </bean>
    <bean id="userController" class="com.woniu.controller.UserController" scope="prototype">
    </bean>

Bean 生命周期

  1. 实例化bean对象(通过构造方法或者工厂方法)
  2. 设置对象属性(setter等)(依赖注入)
  3. 如果Bean实现了BeanNameAware接口,工厂调用Bean的setBeanName()方法传递Bean的ID。(和下面的一条均属于检查Aware接口)
  4. 如果Bean实现了BeanFactoryAware接口,工厂调用setBeanFactory()方法传入工厂自身
  5. 将Bean实例传递给Bean的前置处理器的postProcessBeforeInitialization(Object bean, String beanname)方法
  6. 调用Bean的初始化方法
  7. 将Bean实例传递给Bean的后置处理器的postProcessAfterInitialization(Object bean, String beanname)方法
    使用Bean
    注意
  • 在bean配置上写init-method和destroy-method 是指定特定方法
  • 实现InitializingBean和DisposableBean及其方法

实例化bean 的3种方式

  1. 默认构造器实例化,它会根据默认无参构造函数来创建类对象。如果没有默认无参构造将创建失败
<bean id="hollday" class="com.woniu.entity.Hollday"></bean>
  1. 静态工厂实例化
 <bean id="connection" factory-method="getConnection" class="com.woniuxy.spring.common.JDBCUtils"/>
<!--某个类(JDBCUtils)的静态方法(getConnection),返回值作为bean-->

3.工厂实例化

<bean id="druid" class="com.woniu.dao.Imp.druid"></bean>
<bean id="druidFactory" factory-bean="druid" factory-method="create"
></bean>

spring 的依赖注入

依赖注入(Dependency Injection)它是spring框架核心Ioc的具体表现。业务层仍需要调用持久层的方法。通过依赖注入,两者关系。

  1. set注入
<beans ...>
    <bean id="userDAO" class="com.woniuxy.spring.dao.UserDAOImpl"/> 
	
    <bean id="userService" class="...UserServiceImpl">
    	<property name="userDAO" ref="userDAO" />
        <porperty name="age" value="18"/>
        <property name="aList">
        	<list>
            	<value></value>
                <bean></bean>
                <ref></ref>
            </list>
        </property>
        <property name="map">
        	<map>
            	<entry key="" value=""/>
                ....
            </map>
        </property>
    </bean>
    <!-- 实现了FactoryBean接口,那么这个bean的类型就是car类型,getObject方法的返回值 -->
    <bean id="car" class="xxxx.CarFactoryBean"/>
</beans>
  1. 有参构造注入
<bean id="user" class="com.service.Imp.User">
<constructor-arg index=""(name="") value/>
</bean>
  1. p标签注入

基于注解的SpringIoc实现

  1. 基本注解:对类进行bean 实例化
    @Controller(控制层) @Repository(持久层)@Service(业务层)@Component(不是层架构其他类)
  2. 属性上注解
    @Autowired @Resource

两者区别
@Resource有name和type属性;Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。
@Autowired是spring的注解,是spring2.5版本引入的,Autowired只根据type进行注入,不会去匹配name。如果涉及到type无法辨别注入对象时,那需要依赖@Qualifier或@Primary注解一起来修饰。

  1. xml 或configuration类
    xml 文件配置配置扫包
<context:component-scan back-package="">

configuration类:
@Configuration
@ComponentScan();

在这里插入代码片

基于Configuration类 bean实例化

@Configuration
@PropertySource("jdbc.properties")
public class ApplicationConfig {
    @Value("${jdbc.driverClass}")
    private String driverClassName;

    @Value("${jdbc.url}")
    private String url;

    @Value("${jdbc.userName}")
    private String userName;

    @Value("${jdbc.password}")
    private String password;

    @Bean
    public DruidDataSource druid(){
        DruidDataSource source = new DruidDataSource();
        System.out.printf(url);
        source.setDriverClassName(driverClassName);
        source.setUrl(url);
        source.setUsername(userName);
        source.setPassword(password);
        return source;
    }
    @Bean
    public QueryRunner queryRunner(){
        return new QueryRunner(druid());
    }
    @Bean
    public UserService userService(){
        UserServiceImp imp = new UserServiceImp();
        imp.setUserDao(userDao());
        return imp;
    }
    @Bean
    public UserDao userDao(){
        return new UserDaoImp();
    }
}

Aop

  1. Aop:面向切面编程,简单来说,将程序中重复代码抽取出来,不修代码情况,采用动态代理方式,将通知织入方法,达到提高效率,减少冗余,解耦。

  2. 几个关键词

     目标对象 Target
      连接点 JoinPoint
      切入点 Pointcut
      通知  Advice
      切面  Aspect
      织入 Weaving
    
  3. 3种配置方式:

  <context:component-scan base-package="com.woniu"/>
    <!--目标对象-->
    <bean id="userService" class="com.woniu.service.imp.UserServiceImp"></bean>
    <!--通知-->
    <bean id="beforeExecution" class="com.woniu.component.BeforeExecution"></bean>
    <bean id="methodInterceptor" class="com.woniu.component.MethodInterceptorDemo"></bean>

    <!--切入点-->
    <bean id="pointCut" class="org.springframework.aop.support.JdkRegexpMethodPointcut">
        <property name="pattern" value="com.woniu.service.imp.*Imp.*"></property>
    </bean>
    <!--切面-->
    <bean id="aspect" class="org.springframework.aop.support.DefaultPointcutAdvisor">
        <property name="advice" ref="methodInterceptor"></property>
        <property name="pointcut" ref="pointCut"></property>
    </bean>
    <!--封装类-->
    <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"></bean>

public class XmlAudienceAround  {
    public Object round(ProceedingJoinPoint proceedingJoinPoint){
        Object[] args = proceedingJoinPoint.getArgs();
        Object proceed =null;
        try {
            System.out.println("开启事务");
             proceed = proceedingJoinPoint.proceed(args);
            System.out.println("提交事务");
        } catch (Throwable throwable) {
            throwable.printStackTrace();
            System.out.println("事务回滚");
        }
        return proceed;

    }
}

    <bean id="roundAdvice" class="com.woniu.component.XmlAudienceAround"></bean>

    <aop:config >
        <aop:aspect ref="roundAdvice">
            <aop:pointcut id="pointCut" expression="execution(* com.woniu.service.imp.*.*.(..)"/>
            <aop:around method="round" pointcut-ref="pointCut"/>
        </aop:aspect>
    </aop:config>

自定义

public class TransationAdvice {

    public void begin(){
        System.out.println("开启事务");
    }
    public void rollback(){
        System.out.println("事务回滚");
    }
    public void commit(){
        System.out.println("事务提交");
    }
}

   <bean id="userService" class="com.woniu.service.imp.UserServiceImp"></bean>
    <bean id="txAdvice" class="com.woniu.component.TransationAdvice"></bean>
    <context:component-scan base-package="com.woniu"/>
    <!--切面配置-->
    <aop:config>
        <aop:aspect ref="txAdvice">
            <!--切入点-->
            <aop:pointcut id="servicePointcut" expression="execution(* com.woniu.service.imp.*.*(..))"/>
            <!--通知-->
            <!--前置--><aop:before method="begin" pointcut-ref="servicePointcut"/>
            <!--后置--><aop:after-returning method="commit" pointcut-ref="servicePointcut"/>
            <!--异常--><aop:after-throwing method="rollback" pointcut-ref="servicePointcut"/>
        </aop:aspect>
    </aop:config>

注解方式:

@Component
@Aspect
public class RoundAdvice {

   @Pointcut("execution(* com.woniu.service.imp.*.*(..))")
   public void servicePointCut(){}

   @Around("servicePointCut()")
    public Object roundAdvice(ProceedingJoinPoint pjp){

       Object[] args = pjp.getArgs();
       Object proceed =null;
       try {
           System.out.printf("开始事务");
            proceed = pjp.proceed(args);
           System.out.println("提交事务");
       } catch (Throwable throwable) {
           System.out.println("事务回滚");
           throwable.printStackTrace();

       }
       return proceed;
   }
}
@Configuration
@ComponentScan("com.woniu")
@EnableAspectJAutoProxy
public class AopRound {
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

spring框架 快速入门 的相关文章

随机推荐

  • 通俗易懂的讲讲什么是中间件?

    学习视频 xff1a 学相伴 RabbitMQ最新完整教程IDEA版通俗易懂 KuangStudy 狂神说 学相伴飞哥 哔哩哔哩 bilibili 目录 一 中间件简介1 1 什么是中间件1 2 为什么要使用中间件1 3 中间件特点1 4
  • Gitea——私有git服务器搭建详细教程

    本文将从源代码和docker安装两种方式带大家从0 xff5e 1通过Gitea搭建一个私有git服务器 Gitea 私有git服务器搭建教程 什么是Gitea一 源代码安装方式1 前置环境要求2 下载gitea3 构建运行 二 Docke
  • Golang的交叉编译问题

    参考 xff1a Golang交叉编译各个平台的二进制文件 Go语言中文网 Golang中文社区 studygolang com 也谈Go的可移植性 Tony Bai 今天准备将一个在Mac上开发的Golang项目部署到云服务器上进行部署上
  • Docsify个人网站搭建详细教程

    目录 一 什么是 docsify二 安装 docsify三 多页文档设置四 定制化配置4 1 侧边栏4 2 导航栏4 3 封面4 4 主题 五 部署5 1 部署到Gitee5 2 部署到云服务器 一 什么是 docsify docsify是
  • Hexo集成Algolia实现搜索功能

    2年前搭建的hexo博客好久没有维护了 xff0c 一看 hexo 以及先前使用 butterfly 主题已经更新好几个版本了 xff0c 看介绍在速度性能上有了很大的提高 xff0c 于是打算给 hexo 升个级 xff0c 整理整理翻翻
  • 知识图谱入门——(1)Neo4j基础操作

    1 增 增加一个节点 create n person name 39 我 39 xff0c age 31 带有属性关系 create p Person name 34 我 34 age 34 31 34 包工程 金额 10000 gt n
  • Hexo集成Valine实现评论留言

    2年前搭建的hexo博客好久没有维护了 xff0c 一看 hexo 以及先前使用 butterfly 主题已经更新好几个版本了 xff0c 看介绍在速度性能上有了很大的提高 xff0c 于是打算给 hexo 升个级 xff0c 整理整理翻翻
  • 谷粒商城学习笔记——第一期:项目简介

    一 项目简介 1 项目背景 市面上有5种常见的电商模式 B2B B2C C2B C2C O2O B2B 模式 Business to Business xff0c 是指商家和商家建立的商业关系 如阿里巴巴B2C 模式 Business to
  • 【快速上手mac必备】常用优质mac软件推荐(音视频、办公、软件开发、辅助工具、系统管理、云存储)

    本文章的主要内容是我作为一名大四学生 准程序员 up主这三种身份来给大家推荐一下 mac 上好用的软件以及工具 本人也是从去年9月份开始从windows阵营转移到了mac阵营 xff0c 刚开始使用的时候 xff0c 也曾主观认为mac o
  • 网站徽章shields制作教程

    平时在逛 Gitee Github 等各大代码仓库时 xff0c 往往能看到以下这种徽章式的网页链接 xff0c 美观好看又方便 xff0c 那么这个徽章是如何制作出来的呢 xff1f 本文就带大家制作属于自己的徽章式链接 制作工具 xff
  • Gitee图床无法访问新增防盗链,最新详细解决方案

    目录 一 寻找Gitee图床挂掉的原因二 迁移到腾讯云cos1 创建存储桶2 设置密钥3 配置PicGO4 验证配置是否成功5 迁移Gitee图片6 批量更改url前缀 三 最后想说 一 寻找Gitee图床挂掉的原因 昨天晚上准备整理一下以
  • 假设发生了404错误,都统一跳转到error.html页面,如何在web.xml中配置?

    假设发生了404错误 xff0c 都统一跳转到error html页面 xff0c 如何在web xml中配置 xff1f lt error page gt lt error code gt 404 lt error code gt lt
  • 人工智能研究主要有哪三大学派,其特点是什么?

    人工智能研究主要有哪三大学派 xff0c 其特点是什么 xff1f xff08 1 xff09 符号主义 xff1a 又称为功能模拟学派 xff0c 主要观点认为智能活动的基础是物理符号系统 xff0c 思维过程是符号模式的处理过程 其特点
  • python 绘制graph图——networkx

    span class token keyword import span networkx span class token keyword as span nx span class token keyword import span m
  • MacBookPro M1&M1Pro安装PyQt5

    前言 最近想开发一个GUI图形界面的应用 xff0c 在Mac上面使用Pycharm安装PyQt5怎样都无法安装 xff0c 联想到了可能是当前电脑系统架构导致PyQt5包无法下载或适配 xff0c 所以借鉴了网上大佬的一些方法 xff0c
  • 在普通Maven项目中引入Mybatis

    在普通Maven项目中引入Mybatis 1 引入依赖包 打开项目根目录下的pom xml对dependencies进行配置即引入mybatis和mysql connector java两个依赖包 span class token tag
  • 解决方案|ValueError:The following settings are not supported :{‘username‘: ‘neo4j“}

    此处贴出py2neo官方链接 xff08 2022 06 14 供各位同学参考 https py2neo org 2021 1 问题所在 xff1a 我使用的代码是老版本的 xff0c 而我使用的Neo4j是最新版的 解决方案 xff1a
  • 关于SpringMVC的XML配置步骤

    1 配置前端控制 lt xml version 61 34 1 0 34 encoding 61 34 UTF 8 34 gt lt web app xmlns 61 34 http xmlns jcp org xml ns javaee
  • python仿真——猎狗追兔子

    猎狗追兔子问题 有一只猎狗在原点位置发现了一只兔子在正东方距离它20米的地方 xff0c 此时兔子开始以3米 秒的速度向正北方全速跑去 xff0c 假设猎狗在追赶兔子的时候始终朝着兔子的方向以速度4米 秒全速奔跑 xff0c 用计算机仿真法
  • spring框架 快速入门

    Spring是什么 Spring是一款开源的免费框架 xff0c 是分层的javaSE EE 应用full stack轻量级开源框架 xff0c 以IIoc Inverse Of Control 反转控制 和Aop xff08 Aspect