@Configuration配置类 与xml配置文件功能相同
@Configuration @ComponentScan(value = "com",excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION ,value={Controller.class, Service.class})}) public class MainConfig { @Bean public Person person(){ return new Person("jack",15); } }
@Bean在方法上添加@Bean标签,返回值会被注册在Spring的IOC容器中,默认id为方法名,也可以在@Bean标签上显示添加bean的id
@ComponentScan开启包扫描 与xml配置文件的
<context:component-scan base-package="com"></context:component-scan>功能相同
其中的value属性是要扫描的包,excludeFilters是排除哪些Bean,includeFilters是包括哪些Bean
当使用includeFilters。需使用useDefaultFilters = false才能生效
@Scope 分为单例模式和原始型模式 Singleton和protoType
@Lazy:懒加载 容器启动不创建对象,第一次使用(获取)Bean创建对象,并初始化.
@Conditional : 按照一定的条件进行判断,满足条件给容器中注册bean
@Conditional({PersonCondtion.class}) @Bean public Person person(){ System.out.println("spring的初始化"); return new Person("jack",15); }
public class PersonCondtion implements Condition{ @Override public boolean matches(ConditionContext context, AnnotatedTypeMetadata annotatedTypeMetadata) { BeanDefinitionRegistry registry = context.getRegistry(); if(registry.containsBeanDefinition("controller")){ return true; } return false; } }
实现Condition类,根据返回的boolean来判断是否注入倒容器中去。@Conditional注解可以放在@Bean标签上,也放在放在配置文件上
使用FactoryBean来注册对象
public class StudentFactoryBean implements FactoryBean<Student>{ @Override public Student getObject() throws Exception { return new Student(); } @Override public Class<?> getObjectType() { return Student.class; } @Override public boolean isSingleton() { return true; } }
默认获取到的是工厂bean调用getObject创建的对象
要获取工厂Bean本身,我们需要给id前面加一个&
Bean的生命周期
bean的创建----初始化----销毁的过程
指定初始化和销毁方法
通过@Bean指定init-method和destroy-method ,
BeanPostProcessor:bean的后置处理器
在bean初始化前后进行一些处理工作
postProcessBeforeInitialization:在初始化之前工作
postProcessAfterInitialization:在初始化之后工作
@Value注解
1.基本数值
2.可以写SpEl; #{}
3.可以写${};取出配置文件中的值(在运行环境变量里面的值)
@PropertySource
导入外部的properies文件.
@Autowired 属性的自动注入,根据ioc容器里的类型来装配,当容器有多个相同类的对象时。根据属性名作为id来装配,也可以加上@Qualifier注解来根据id来进行注入
@import注解
@import注解放在配置类上,可以导入到ioc容器中,使用@import导入的类的id为类的全类名
Spring的AOP:[动态代理]
AOP:【动态代理】
* 指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程模式
* 1、导入aop模块
* 2、定义一个业务逻辑类(MathCalculator),在业务逻辑运行的时候将日志进行打印(方法之前,方法运行结 束,方法出现异常等)
* 3、定义一个日志切面类(LogAspect),切面类里面的方法需要动态感知MathCalculator.div运行到哪里,然后执行
* 通知方法:
* 前置通知(@Before):logStart:在目标方法(div)运行之前运行 参数列表传入joinPoint可获取到方法的相关属性,且该参数必须放在第一个参数,否则无法识别
* 后置通知(@After):logEnd:在目标方法(div)运行之后运行,无论方法正常结束还是异常结束
*
返回通知(@AfterReturning(returning可以指定封装返回值的参数)):logReturn:在目标方法(div)正常返回之后运行
* 异常通知(@AfterThrowing):logException:在目标方法(div)出现异常以后运行
* 环绕通知(@Around):动态代理,手动推进目标方法运行(joinPoint.proceed())
* 4、给切面类的目标方法标注何时何地运行(通知注解)
* 5、将切面类和目标和业务逻辑类(目标方法所在类)都加入到容器中;
* 6、告诉Spring哪个类是切面类(给切面类上加一个注解@Aspect)
* [7]、需要给配置类加一个@EnableAspectJAutoProxy【开启基于注解的aop模式】
* 在spring中很多的@EnableXXX;
*
* 三步:
* 1、将业务逻辑组件和切面类都加入到容器中,告诉spring哪个是切面类(@Aspect)
* 2、在切面类上的每一个通知方法标注通知注解,告诉spring何时何地运行(切入点表达式)
* 3、开启基于注解的aop模式@EnableAspectJAutoProxy
Spring的事务