Spring框架简介
Spring是一个开源的框架,是2003年兴起的一个轻量级Java框架,可以解决程序中关于实例的问题。
Spring功能:
控制反转(IOC):由Spring来生产实例
依赖注入(DI):将生产好的实例赋值给引用上
切面编程(AOP):在实例执行的前中后去增加控制
用于Bean的管理容器:
所谓的Bean的就是满足固定格式要求的类。
要求:
- 属性私由化
- 为属性提供get/set方法
常见管理Bean容器的种类:
- 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管理容器将实例注入给引用名
依赖注入有二种方式:
- 通过xml配置文件
- 通过属性set方法进行注入
- 通过构造器注入
- 注解注入
@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 规范要求:
-
私有字段 :类的字段必须是私有的(
private
)。 -
公共的 Getter 和 Setter :为每个字段提供公共的
get
和set
方法。 -
无参构造函数:类必须有一个公共的无参构造函数。
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 joinPoint
:JoinPoint
是 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
方法,在应用启动后执行其中的代码。