4.spring:@Profile,AOP
2024-09-28 01:27:23
Profile:
可以根据当前的环境,动态激活和切换一系列的组件功能
指定组件在那个环境下才能被注册到容器中,不指定任何环境下都能注册到
1.加了环境标识的bean只有环境激活的时候才能注册到容器中
默认是default ,@Profile("default") 才能加入到环境中
2.还可以下载类上,只有在当时的环境下,整个类的方法才会生效
3.默认没标识的bean在,任何环境下都是加载的
db.user=root
db.password=
db.jdbcUrl=jdbc:mysql://localhost:3306/users
db.drivetClass=com.mysql.jdbc.Driver
@PropertySource("classpath:/db.properties")
@Configuration
public class MainConfigProfile {
@Value("${db.user}")
private String user;
@Value("${db.password}")
private String pwd;
@Value("${db.jdbcUrl}")
private String jdbcUrl;
@Value("${db.drivetClass}")
private String DriverClass; @Profile("test")
@Bean("testDatasource")
public ComboPooledDataSource datasource() throws Exception{
ComboPooledDataSource datasource = new ComboPooledDataSource();
datasource.setUser(user);
datasource.setPassword(pwd);
datasource.setJdbcUrl(jdbcUrl);
datasource.setDriverClass(DriverClass);
return datasource;
} @Profile("dev")
@Bean("devDatasource")
public ComboPooledDataSource datasource1() throws Exception{
ComboPooledDataSource datasource = new ComboPooledDataSource();
datasource.setUser(user);
datasource.setPassword(pwd);
datasource.setJdbcUrl("jdbc:mysql://localhost:3306/ssm");
datasource.setDriverClass(DriverClass);
return datasource;
}
}
@Test
public void test7(){
//创建一个application
AnnotationConfigApplicationContext app =
new AnnotationConfigApplicationContext();
//设置环境
app.getEnvironment().setActiveProfiles("dev");
//注册配置类
app.register(MainConfigProfile.class);
//启动刷新容器
app.refresh(); String[] names = app.getBeanDefinitionNames();
for(String name : names){
System.out.println(name);
}
}
注:app.getEnvironment().setActiveProfiles("dev","test");可以同时写多个
mainConfigProfile
devDatasource
此时可以看出 app.getEnvironment().setActiveProfiles("dev");
这里只添加了一个环境,所以得到在dev环境下的bean,其余的均不会装配到bean容器中
此种情况下,也会自动装入到bean容器
@Profile("default")
@Bean("devDatasource")
public ComboPooledDataSource datasource1() throws Exception{
ComboPooledDataSource datasource = new ComboPooledDataSource();
datasource.setUser(user);
datasource.setPassword(pwd);
datasource.setJdbcUrl("jdbc:mysql://localhost:3306/ssm");
datasource.setDriverClass(DriverClass);
return datasource;
}
AOP:
在程序运行期间,能够动态的将某段代码切入到指定的位置进行编程
1.导入aop模块:aspects
2.业务逻辑类
3.日志切面类:
前置通知:@Before
后置通知: @After
异常通知:@AfterReturning
返回通知:@AfterThrowing
环绕通知:@Around
4.将切面类和业务逻辑加入容器里
5.告诉spring那个类是切面类
切面类加一个注解@Aspect:告诉spring当前类是一个切面类
6.给配置类家@EnableAspectJAutoProxy 开启基于注解模式动态代理
//切面类
@Aspect
public class LogAspects { //抽取公共的接入点
//本类的引用:pointCut()
//外部类的引用:coom.MrChengs.aop.LogAspects.pointCut()
@Pointcut("execution(public int coom.MrChengs.aop.MathCAL.*(..))")
public void pointCut(){}; //目标方法之前切入;切入点表达式(指定在那个方面切入)
//JoinPoint这个参数一定要出现在参数表的第一位,否则会报错
@Before("pointCut()")
public void loginStart(JoinPoint joinpoint){
//拿到执行的数据
Object [] args = joinpoint.getArgs(); System.out.println("开始计算:"+joinpoint.getSignature().getName()+"--"+Arrays.asList(args));
} //无论正常还是异常结束
@After("pointCut()")
public void loginEnd(){
System.out.println("结束计算");
}
@AfterReturning(value="pointCut()",returning="res")
public void logReturn(int res ){
System.out.println("结果L:" + res);
}
@AfterThrowing(value ="pointCut()",throwing="exc")
public void loginException(Exception exc){
System.out.println("Exception:" + exc);
}
}
//业务类
public class MathCAL {
public int div(int i,int j){
System.out.println("正在计算.....");
return (i / j);
}
}
@EnableAspectJAutoProxy
@Configuration
public class MainAopConfig {
//业务逻辑类
@Bean
public MathCAL mathCal(){
return new MathCAL();
}
//切面类
@Bean
public LogAspects logAspect(){
return new LogAspects();
} }
@Test
public void test(){
AnnotationConfigApplicationContext app = new
AnnotationConfigApplicationContext(MainAopConfig.class); MathCAL math = app.getBean(MathCAL.class);
math.div(, );
}
开始计算:div--[, ]
正在计算.....
结束计算
Exception:java.lang.ArithmeticException: / by zero
AOP原理:
@EnableAspectJAutoProxy
@Import(AspectJAutoProxyRegistrar.class)
public @interface EnableAspectJAutoProxy {
...
}
class AspectJAutoProxyRegistrar implements ImportBeanDefinitionRegistrar {
...
}
利用AspectJAutoProxyRegistrar自定义为容器注入bean
最新文章
- java-并发-同步
- 关于watir-webdriver中文乱码问题
- arcmap配置的mxd慢的问题
- linux下内存泄露检测工具Valgrind介绍
- Hibernate+jsp+struts+spring做增删该查,
- 在eclipse中安装freemarker插件及html使用freemarker编辑器
- Java入门到精通——调错篇之解决MyEclipse 输入注册码后:Enter or update your subscription information.问题
- 自选项目--手机锁屏软件--NABC分析
- chrome浏览器无法设置打开特定网页
- Visual C#使用DirectX实现视频播放
- 转换 TColor 到 HTML 颜色串
- poj2245Lotto(最基础的dfs)
- C#多线程的用法7-线程间的协作ManualResetEvent
- Split分割字符串
- 从头开始学JAVA[Day01]
- CSS3 利用border-radius实现椭圆角
- Stateful Kubernetes Applications Made Easier: PSO and FlashBlade
- WCF数据交互时长度超过8192
- NET的堆和栈04,对托管和非托管资源的垃圾回收以及内存分配
- shiro 框架