spring基础组件和使用
文章目录
- spring基础组件和使用
- 前言
- 一、spring加载bean
- 1.通过XML加载bean
- 2.通过注解加载bean,简化配置
- 二、spring常见注解及其功能
- 1.bean扫描注解@ComponentScan
- 2.基本作用域注解@Scope
- 3.懒加载@Lazy
- 4.bean角色声明注解
- 总结
前言
此系列主要复习spring相关知识点,记录spring使用各种方式
一、spring加载bean
1.通过XML加载bean
1.在resources文件夹下建立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.bean.Person">
<property name="name" value="james"></property>
<property name="age" value="19"></property>
</bean>
</beans>
2.加载XML获取其中bean信息
public static void main(String[] args) {
//读取XML文件
ApplicationContext app = new ClassPathXmlApplicationContext("com/bean.xml");
//通过预先配置好的bean名称加载bean
Person person = (Person) app.getBean("person");
System.out.println(person.toString());
}
2.通过注解加载bean,简化配置
1.通过注解@Configuration定义配置类,@Bean定义bean信息
//用于定义配置类 取代XML
@Configuration
public class MainConfig {
@Bean
public Person getPerson() {
return new Person("测试", 20);
}
}
2.加载注册类,获取其中的bean
注意@Bean不配置名称则取方法名为bean名称
public static void main(String[] args) {
//读取config类
ApplicationContext app = new AnnotationConfigApplicationContext(MainConfig.class);
//获取bean 默认bean是由方法名决定 也可在@Bean中自定义
Person person = (Person) app.getBean("getPerson");
System.out.println(person.toString());
}
二、spring常见注解及其功能
1.bean扫描注解@ComponentScan
1.该注解通过配置扫描路径,从中找出标识了需要装配的类自动装配到spring的bean容器中
即扫描被@Component注解标记的bean。@Controller @Service等注解源码均存在@Component
@Configuration
//ComponentScan 用于扫描bean注解(例如@Controller @Service等)
@ComponentScan(value = "com.test2")
public class Test2Config {
}
2.通过配置@Filter可自由定义扫描规则,实现TypeFilter 接口可自由判断是否需要注册bean
@Configuration
//ComponentScan 用于扫描bean注解(例如controller service等)
//@ComponentScan value:指定要扫描的包
//excludeFilters = Filter[] 指定扫描的时候按照什么规则排除那些组件
//includeFilters = Filter[] 指定扫描的时候只需要包含哪些组件
//useDefaultFilters = false 默认是true,扫描所有组件,要改成false
//----扫描规则如下
//FilterType.ANNOTATION:按照注解
//FilterType.ASSIGNABLE_TYPE:按照给定的类型;比如按BookService类型
//FilterType.ASPECTJ:使用ASPECTJ表达式
//FilterType.REGEX:使用正则指定
//FilterType.CUSTOM:使用自定义规则,自已写类,实现TypeFilter接口
@ComponentScan(value = "com.test2", includeFilters = {
@ComponentScan.Filter(type = FilterType.CUSTOM, classes = {Test2TypeFilter.class})
}, useDefaultFilters = false)
public class Test2Config {
}
public class Test2TypeFilter implements TypeFilter {
/**
* @param metadataReader 读取到当前正在扫描类的信息
* @param metadataReaderFactory 可以获取到其他任何信息
* @return
* @throws IOException
*/
//自定义扫描注解规则
public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
//获取当前类注解信息
AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();
System.out.println("bean注解信息:" + annotationMetadata.getAnnotationTypes());
//获取当前正在扫描类信息
ClassMetadata classMetadata = metadataReader.getClassMetadata();
System.out.println("bean信息:" + classMetadata.getClassName());
//获取当前类资源信息
Resource resource = metadataReader.getResource();
System.out.println("bean资源信息:" + resource.getURL());
if (classMetadata.getClassName().contains("Order")) {
return true;
}
return false;
}
}
2.基本作用域注解@Scope
prototype: 多实例:IOC容器启动并不会去调用方法创建对象放在容器中,而是 每次获取的时候才会调用方法创建对象
singleton: 单实例(默认):IOC容器启动会调用方法创建对象放到IOC容器中
以后每交获取就是直接从容器中取
prototype主要应用在bean信息不共享的场景,即一个请求所需的bean信息重新初始化,不与其余请求公用
//singleton单例模式 -- 全局有且仅有一个实例
//prototype原型模式 -- 每次获取Bean的时候会有一个新的实例
//可防止多线程共用非静态变量引起的问题 获取bean时才会创建
//request -- request表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP request内有效
//session -- session作用域表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP session内有效
//globalsession -- global session作用域类似于标准的HTTP Session作用域,不过它仅仅在基于portlet的web应用中才有意义
@Bean
@Scope("prototype")
public Person getPerson01() {
return new Person("测试", 20);
}
3.懒加载@Lazy
IOC容器初始化是不会创建,bean获取bean时创建
4.bean角色声明注解
@Component 组件,标记为bean,没有明确的角色
@Service 在业务逻辑层使用(service层)
@Repository 在数据访问层使用(dao层)
@Controller 在展现层使用,控制器的声明
总结
这里只是列举spring使用基本注解,后续还有切面,异步,定时慢慢更新