Spring

Spring框架简介

Spring是一个开源的框架,是2003年兴起的一个轻量级Java框架,可以解决程序中关于实例的问题。

Spring功能:

控制反转(IOC):由Spring来生产实例

依赖注入(DI):将生产好的实例赋值给引用上

切面编程(AOP):在实例执行的前中后去增加控制

用于Bean的管理容器:

所谓的Bean的就是满足固定格式要求的类。

要求:

  1. 属性私由化
  2. 为属性提供get/set方法

常见管理Bean容器的种类:

  1. EJB 是JavaEE中13项技术之一

Spring管理容器特点:

Spring内部是由Java的反射机制实现实例的创建,默认情况下只开启基础服务,其他服务是关闭的,可以通过配置开启。

在Spring配置文件中的bean标记里通过属性配置具体的类信息

Id:标识符,用于表示类的引用,不能存在特殊字符,只能包含数字,字母下划线

name:标识符 可以是任意字符

class:配置类的地址包括包名类名

SpringIOC控制反转

将java中类交给Spring来管理

有四种管理方式:

调用无参构造器,通过无参构造器创建对象

调用静态工厂方法

调用工厂对象的工厂方法

扫描注解

6.1、调用无参构造器通过无参构造器创建对象

1、容器启动时创建所有对象,通过getBean获得对应的对象实例

2、所有的实例都是单例模式

通过scope="prototype"设置非单例模式

通过init-method = "init" 设置初始化方式

通过lazy-init = "true" 设置懒加载 注该属性不要与scope属性一起使用

6.2、调用静态工厂方法

通过bean标记中的factory-method配置,Spring实例化时会通过

6.3、调用工厂对象的工厂方法

通过bean标记中factory-bean配置工厂类,通过factory-method配置工厂类中的工厂方法

6.4、扫描注解

SpringDI(依赖注入)

将SpringIOC创建的实例赋值到对应的引用中称为,依赖注入。通过Spring管理容器将实例注入给引用名

依赖注入有二种方式:

  1. 通过xml配置文件
    1. 通过属性set方法进行注入
    2. 通过构造器注入
  2. 注解注入

@Service用于标注业务层组件

@Controller 用于标注控制层组件

@Repository 用于标注数据访问层组件 dao

@Component 当某一个类不确定属于哪种层的

@Resource 根据名称注入(jdk提供)

@Autowired 根据名称注入(Spring提供的)

综合案例:

User类:

java 复制代码
package org.example.conreverse;

public class User {
    private String name;

    public User(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

注意:为什么用户的类要这么写因为要符合Bean的规范

符合 Java Bean 规范

Java Bean 是一种符合特定规范的 Java 类,通常用于封装数据。Java Bean 规范要求:

  1. 私有字段 :类的字段必须是私有的(private)。

  2. 公共的 Getter 和 Setter :为每个字段提供公共的 getset 方法。

  3. 无参构造函数:类必须有一个公共的无参构造函数。

UserService类

java 复制代码
package org.example.conreverse;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserService {
    public final UserReposetory userReposetory;

    @Autowired // Spring 自动注入依赖
    public UserService(UserReposetory userReposetory) {
        this.userReposetory = userReposetory;
    }

    public void saveUser(User user){
        userReposetory.save(user);
    }
}

注:@Service注解主要用于将类标识为 Spring Bean 并表明它是业务逻辑层的一部分

当一个类被 @Service 注解标注后,在 Spring 应用启动进行组件扫描时,Spring 会自动将这个类实例化,并把创建好的实例作为一个 Bean 注册到 Spring 的应用上下文中Spring 会在启动过程中创建 UserService 的一个实例,你无需手动使用 new 关键字去创建它。

UserRepository类

java 复制代码
package org.example.conreverse;

import org.springframework.stereotype.Repository;

@Repository
public class UserReposetory {
    public void save(User user ){
        System.out.println("UserReposetory saved"+user.getName());
    }
}

注意:@Repository 也是 Spring 的构造型注解,它继承自 @Component。当 Spring 应用启动并进行组件扫描时,若发现某个类使用了 @Repository 注解,Spring 会自动将这个类实例化,并把该实例作为一个 Spring Bean 注册到应用上下文中。Spring 会创建 UserReposetory 类的一个实例,并且可以在其他地方通过依赖注入的方式使用这个实例。位于数据访问层

LoggingAspect类

java 复制代码
package org.example.conreverse;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

@Aspect // 标记为切面
@Component // 标记为 Spring Bean
public class LoggingAspect {
    @Before("execution(* org.example.conreverse.UserService.saveUser(..))") // 定义切点
    public void logBeforeRegistration(JoinPoint joinPoint) {
        System.out.println("Logging before user registration");
    }

    @After("execution(* org.example.conreverse.UserService.saveUser(..))") // 定义切点
    public void logAfterRegistration(JoinPoint joinPoint) {
        System.out.println("Logging after user registration");
    }

}

注意:

  • @Aspect :这是 AspectJ 框架提供的注解,用于将 LoggingAspect 类标记为一个切面。切面是一个模块化的关注点,它包含了一组通知(Advice)和切点(Pointcut)的定义,用于在程序的特定位置插入额外的逻辑。
  • @Component :这是 Spring 框架提供的注解,用于将 LoggingAspect 类标记为一个 Spring Bean。这样,Spring 在启动时会自动扫描并将该类的实例注册到应用上下文中,以便后续使用。
  • @Before:这是一个通知注解,表示这是一个前置通知。前置通知会在目标方法执行之前执行。
  • execution(* org.example.conreverse.UserService.saveUser(..)) :这是一个切点表达式,用于定义哪些方法会触发该通知。具体解释如下:
    • execution:表示匹配方法执行连接点。
    • *:表示返回值类型为任意类型。
    • org.example.conreverse.UserService.saveUser:表示要匹配的方法是 org.example.conreverse 包下 UserService 类的 saveUser 方法。
    • (..):表示该方法可以接受任意数量和类型的参数。
  • JoinPoint joinPointJoinPoint 是 AspectJ 提供的一个接口,它包含了当前连接点(即目标方法)的相关信息,如方法名、参数等。在这个例子中,我们没有使用 joinPoint 的具体信息,只是简单地打印了一条日志。

主程序:

java 复制代码
package org.example.conreverse;

import org.example.conreverse.User;
import org.example.conreverse.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application implements CommandLineRunner {
    @Autowired
    private UserService userService;

    public static void main(String[] args) {
        // 启动 Spring Boot 应用
        SpringApplication.run(Application.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        // 在应用启动后执行代码
        User user = new User("John Doe");
        userService.saveUser(user);
    }
}

注意:

  • @SpringBootApplication注解 :这是一个组合注解,包含了@Configuration@EnableAutoConfiguration@ComponentScan等注解,用于启动 Spring Boot 应用并自动配置相关功能。
  • c ommandLineRunner接口 :实现该接口的run方法,在应用启动后执行其中的代码。
相关推荐
sevevty-seven13 分钟前
Spring Boot 自动装配原理详解
java·spring boot·后端
lamdaxu1 小时前
分布式调用(02)
后端
daiyunchao1 小时前
让Pomelo支持HTTP协议
后端
Jeremy_10221 小时前
SpringBatch之ResultSet.next()
spring·batch
芒猿君1 小时前
AQS——同步器框架之源
后端
SaebaRyo1 小时前
手把手教你在网站中启用https和http2
后端·nginx·https
Forget the Dream1 小时前
设计模式之迭代器模式
java·c++·设计模式·迭代器模式
大丈夫在世当日食一鲲2 小时前
Java中用到的设计模式
java·开发语言·设计模式
A-Kamen2 小时前
Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现与实战指南
java·spring boot·后端
练川2 小时前
Stream特性(踩坑):惰性执行、不修改原始数据源
java·stream