1 Spring概述
1.1 Spring是什么?
1.2 Spring的发展历程
1.3 Spring目标
1.4 Spring的体系目标
image.png1 Spring Core:即,Spring核心,它是框架最基础的部分,提供IOC和依赖注入特性
2 Spring Context:即,Spring上下文容器,它是BeanFactory功能加强的一个子接口
3 Spring Web:它提供Web应用开发的支持
4 Spring MVC:它针对Web应用中MVC思想的实现
5 Spring DAO:提供对JDBC抽象层,简化了JDBC编码,同时,编码更具有健壮性。
6 Spring ORM:它支持用于流行的ORM框架的整合,比如:Spring + Hibernate、Spring + iBatis、Spring + JDO的整合等等。
7 Spring AOP:AOP即,面向切面编程,它提供了与AOP联盟兼容的编程实现
1.5 Spring常用组件
image.png2 Sping注入bean的方式
2.1 第一种:bean.xml
- bean.xml
<?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="person" class="com.enjoy.cap1.Person">
<property name="name" value="james"></property>
<property name="age" value="19"></property>
</bean>
</beans>
利用<bean>标签将需要注入spring容器的对象进行配置,此方式现在比较少用
- 加载bean.xml至容器中
public class MainTest1 {
public static void main(String args[]){
//把beans.xml的类加载到容器
ApplicationContext app = new ClassPathXmlApplicationContext("beans.xml");
//从容器中获取bean
Person person = (Person) app.getBean("person");
System.out.println(person);
}
}
- 输出结果
Person [name=james, age=19]
获取到了xml中配置的类和类的属性值
2.2 第二种:@Configuration @Bean
@Configuration注解,就相当于把设置了此注解的类作为配置类,替代了之前的bean.xml
@bean 就相当于之前xml中的<bean>标签,可设置注入对象
//配置类====配置文件
@Configuration
public class MainConfig {
//给容器中注册一个bean, 类型为返回值的类型
//person01()方法名默认为bean的ID
// 如何更改bean的ID值
// 1、直接改person01()的方法名
// 2、直接在@Bean("abcPerson")添加你想要的的ID名,比如当前这个bean的ID就被改为"abcPerson"
@Bean("abcPerson")
public Person person01(){
return new Person("james",20);
}
}
调用类
public class MainTest2 {
public static void main(String args[]){
ApplicationContext app = new AnnotationConfigApplicationContext(MainConfig.class);
//获取容器中所有已注入Person类型的beanName
//beanName相当于之前<bean>标签的id="person"属性
String[] namesForBean = app.getBeanNamesForType(Person.class);
for(String name:namesForBean){
System.out.println(name);
}
}
}
2.3 第三种:@Configuration @ComponentScan
@ComponentScan(value="com.enjoy.cap2")表示扫描此目录下的包
- Config类
@Configuration
//@Controller @Service @Respostry @Component
@ComponentScan(value="com.enjoy.cap2", includeFilters={
@Filter(type=FilterType.ANNOTATION, classes={Controller.class})
}, useDefaultFilters=false)
public class Cap2MainConfig {
//给容器中注册一个bean, 类型为返回值的类型,
@Bean
public Person person01(){
return new Person("james",20);
}
}
在@ComponentScan中加入扫描规则
- @ComponentScan value:指定要扫描的包
- excludeFilters = Filter[] 指定扫描的时候按照什么规则排除那些组件
- includeFilters = Filter[] 指定扫描的时候只需要包含哪些组件
- useDefaultFilters = false 默认是true,扫描所有组件,要改成false,使用自定义扫描范围,否则自定义不生效
----扫描规则如下 - FilterType.ANNOTATION:按照注解
- FilterType.ASSIGNABLE_TYPE:按照给定的类型;比如按BookService类型
- FilterType.ASPECTJ:使用ASPECTJ表达式
- FilterType.REGEX:使用正则指定
- FilterType.CUSTOM:使用自定义规则,自已写类,实现TypeFilter接口
FilterType.CUSTOM的例子,常用
先新增自定义过滤规则类:
public class CunstomTypeFilter implements TypeFilter{
private ClassMetadata classMetadata;
/*
* MetadataReader:读取到当前正在扫描类的信息
* MetadataReaderFactory:可以获取到其他任何类信息
*/
@Override
public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory)
throws IOException {
//获取当前类注解的信息
AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();
//获取当前正在扫描的类信息
classMetadata = metadataReader.getClassMetadata();
//获取当前类资源(类的路径)
Resource resource = metadataReader.getResource();
String className = classMetadata.getClassName();
System.out.println("----->"+className);
if(className.contains("order")){//当类包含er字符, 则匹配成功,返回true
return true;
}
return false;
}
}
在config类中声明并调用
在Cap2MainConfig申明
@ComponentScan(value="com.enjoy.cap2",includeFilters={
@Filter(type=FilterType.CUSTOM,classes={JamesTypeFilters.class})
},useDefaultFilters=false)
public class Cap2MainConfig2 {}
image.png
2.4 注入条件判断
2.5 对bean的属性设置
2.5.1 @Scope注解
该注解主要是定义当前bean在Spring容器中是否单例,Spring默认是单例
语法如下
@Scope(“prototype”) //多实例
prototype: 多实例:IOC容器启动并不会去调用方法创建对象放在容器中,而是 每次获取的时候才会调用方法创建对象,见test02
singleton: 单实例(默认):IOC容器启动会调用方法创建对象放到IOC容器中
以后每交获取就是直接从容器(理解成从map.get对象)中拿
request: 主要针对WEB应用,同一次请求创建一个实例
session: 同一个session创建一个实例(后面两个用得不多,了解即可)
2.5.2 @lazy懒加载
config类
调用类
image.png
当在Cap4MainConfig加入@Lazy时, 只有获取anno.getBean时才会加载到IOC容器中
网友评论