目录
方式一:在xml中进行显示配置(spring旧版本,基本不用)
方式二:Bean的注解配置(隐式的bean发现机制和自动装配):
方式一:声明属性源,并通过Spring的Environment来检索属性。
Spring简史:
Spring概述
Spring框架是一个轻量级的企业级开发的一站式解决方案。主要提供了IOC容器、AOP、数据访问、Web开发、消息、测试等相关技术的支持。
Spring使用简单的POJO(Plain Old Java Object,即无任何限制的普通Java对象)来进行企业级开发。
Bean:每一个被Spring管理的对象都称之为Bean;
Spring提供了一个IOC容器用来初始化对象,解决对象间的依赖管理和对象的使用。
Spring的模块:
Spring生态:
Spring Boot:使用默认开发配置来实现快速开发。
Spring Cloud:为分布式系统开发提供工具集。
Spring框架本身四大原则:
- 使用POJO进行轻量级和最小侵入式开发。
- 通过依赖注入和接口编程实现松耦合。
- 通过AOP和默认习惯进行声明式编程。
- 使用AOP和模板减少模式化代码
依赖注入(DI):
依赖注入(dependency injection-DI):容器负责创建对象和维护对象间的依赖关系,而不是通过对象本身负责自己的创建和解决自己的依赖。(通过DI,对象的依赖关系将由系统中负责协调各对象的第三方组件在创建对象的时候进行设定。对象无需自己创建或管理他们的依赖关系,依赖关系被自动注入到需要它们的对象当中去)
目的:解耦,体现一种“组合”的理念。 如果你希望你的类具备某项功能时,是继承还是组合这个类比较好呢?继承一个父类,子类与父类耦合,组合则是耦合度降低。
控制反转(Inversion of Control-IOC):控制反转是通过依赖注入实现的。负责创建Bean,并通过容器将功能类Bean注入到你需要的Bean中。Spring提供使用xml、注解、Java配置、groovy配置实现Bean的创建和注入。
元数据:xml配置、注解配置还是Java配置都成为元数据。即描述数据的数据。元数据本身不具备任何执行能力,只能通过外界代码来对这些元数据进行解析后进行一系列有意义操作。Spring解析这些元数据进行Bean初始化、配置和管理依赖。
Bean的作用域(Scope):
Scope描述的是Spring容器如何新建Bean实例的。
- 单例(Singleton)-默认:ioc容器启动会调用方法创建对象放到ioc容器中
- 原型(Prototype):ioc容器启动并不会调用方法创建对象放在容器中。每次获取的时候才会调用方法创建对象
- 会话(Session)
- 请求(Rquest)
@Scope 选择其他作用域
传统方式:new
每个对象负责管理与自己相互协作的对象(它所依赖的对象)的引用。
特点:耦合度高
Spring配置-装配Bean
Spring容器负责创建应用程序中的bean并通过DI来协调这些对象之间的关系。
方式一:在xml中进行显示配置(spring旧版本,基本不用)
Spring容器:
在Spring IOC容器读取Bean配置创建Bean实例之前,必须对它进行实例化。只有在容器实例化后,才可以从IOC容器里面获取Bean实例并使用。
Spring提供了两种类型的IOC容器实现:
- BeanFactory:
- ApplicationContext:是BeanFactory的接口,基本上都用这个而不是底层BeanFactory
xml依赖注入的方式:
- 属性注入
- 构造器注入:在构造的时候把任务作为构造器参数传入进来
- 工厂方法注入
方式二:Bean的注解配置(隐式的bean发现机制和自动装配):
声明Bean的注解(发现机制:Spring会自动发现应用上下文中所创建的bean):
- @Component 组件,没有具体角色。
- @Service 在业务逻辑层(Service)使用
- @Repository 在数据访问层(Dao)使用
- @Controller 在展现层(MVC——> Spring MVC)使用
注入Bean的注解(自动装配:Spring自动满足bean之间的依赖):
- @Resource : 注解属于JSR250的 ,没有required属性
- @Inject: JSR-330 提供的注解:没有required属性,使用时需要导入javax.inject依赖
- @Autowired : Spring的:有required属性,required=false,如果找不到该bean不会报异常 @Autowired(required=false)
设置组件扫描的基础包:@ComponentScan
缺点:
将第三方库中的组件装配到你的应用中,在这种情况下,是没有办法在它的类上加@Component 和@Autowired等注解的,因此这种方式不可用.
-------如何处理自动装配的歧义性:
标示首选的bean:@Primary
限定自动装配的bean:@Qualifier
// 使用@Service注解声明当前类是Spring管理的一个Bean
@Service("groupStuService")
public class GroupStuServiceImpl extends BaseServicePlusImpl<GroupStuDao,GroupStuEntity> implements GroupStuService {
@Override
public void deleteGroupStudentById(String id) {
groupStuDao.deleteGroupStudentById(id);
}
}
@Service("groupService")
@Slf4j
public class GroupServiceImpl extends BaseServicePlusImpl<GroupDao, GroupEntity> implements GroupService {
// 使用@Resource注解将GroupStuService的实体Bean注入到此类中来,让此类具备了GroupStuService的功能
@Resource
private GroupStuService groupStuService;
@Override
public void deleteGroupById(String id) {
groupStuService.deleteGroupStudentById(id);
}
}
方式三:配置类JavaConfig
Java配置时通过@Configuration 和 @Bean 来实现的
创建配置类:@Configuration 声明当前类是一个配置类,该类应该包含在Spring应用上下文中如何创建bean的细节。相当于xml文件
声明简单的Bean:@Bean 注解在方法上,声明当前方法的返回值为一个Bean
借助JavaConfig实现注入:装配bean最简单的方式:引用创建bean的方法
例如:RedisConfig
方式四、导入和混合配置:
1. 在JavaConfig中引用XML:
@Import注解导入配置类
@ImportResource
2.在XML中引用JavaConfig:
运行时值注入(注入外部的值):
依赖注入的时候:
一方面:通常将一个bean引用注入到另一个bean属性或构造器参数中。它通常来讲指的是将一个对象与另一个对象进行关联。
另一方面:将一个值注入到bean属性或者构造器参数中。有时候硬编码是可以的,但是想让这些值在运行时再确定,Spring提供了两种在运行时求值的方式。
运行时求值方式:
- 属性占位符(Property placeholder)
- Spring表达式语言(SpELl)
方式一:声明属性源,并通过Spring的Environment来检索属性。
占位符:${...}
Spring表达式语言(SpELl):#{...}
是一个支持运行时查询和操作对象图的强大的表达式语言,支持xml和注解中使用表达式。
特点:
- 使用bean的ID来引用bean
- 调用方法和访问对象的属性
- 对值进行算术、关系和逻辑运算
- 正则表达式匹配
- 集合操作