1、扫包
1. 扫描指定类文件
@ComponentScan(basePackageClasses = Person.class)
2. 扫描指定包,使用默认扫描规则,即被@Component, @Repository, @Service, @Controller或者已经声明过@Component自定义注解标记的组件;
@ComponentScan(value = "com.yibai")
3. 扫描指定包,加载被@Component注解标记的组件和默认规则的扫描(因为useDefaultFilters默认为true)
@ComponentScan(value = "com.yibai", includeFilters = { @Filter(type = FilterType.ANNOTATION, value = Component.class) })
4. 扫描指定包,只加载Person类型的组件
@ComponentScan(value = "com.yibai", includeFilters = { @Filter(type = FilterType.ASSIGNABLE_TYPE, value = Person.class) }, useDefaultFilters = false)
5. 扫描指定包,过滤掉被@Component标记的组件
@ComponentScan(value = "com.yibai", excludeFilters = { @Filter(type = FilterType.ANNOTATION, value = Component.class) })
6. 扫描指定包,自定义过滤规则
@ComponentScan(value = "com.yibai", includeFilters = { @Filter(type = FilterType.CUSTOM, value = ColorBeanLoadFilter.class) }, useDefaultFilters = true)
示例:
boy类
package com.xiangwen.test; import com.xiangwen.test.aop.IBuy; import org.springframework.stereotype.Component; @Component public class Boy implements IBuy { @Override public String buy() { System.out.println("男孩买了一个游戏机"); return "游戏机"; } }
扫包
package com.xiangwen.test.aop; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @Configuration @ComponentScan( "com.xiangwen.test") public class AppConfig { }
运行
package com.xiangwen.test.aop; import com.xiangwen.test.Boy; import com.xiangwen.test.Girl; import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class AppTest { public static void main(String[] args) { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class); Boy boy = context.getBean("boy",Boy.class); Girl girl = (Girl) context.getBean("girl"); boy.buy(); girl.buy(); } }
2、AOP
package com.xiangwen.test.aop; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.springframework.stereotype.Component; @Aspect @Component public class BuyAspectJ { @Before("execution(* com.xiangwen.test.aop..*.*(..))") public void haha(){ System.out.println("男孩女孩都买自己喜欢的东西"); } }
execution表达式
5种通知类型
通过@Pointcunt来定义一个切点
package com.xiangwen.test.aop; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.*; import org.springframework.stereotype.Component; @Aspect @Component public class BuyAspectJ { @Pointcut("execution(* com.xiangwen.test.aop..*.*(..))&& args(price)") public void myPonit(double price){}; @Before("execution(* com.xiangwen.test.aop..*.*(..))") public void haha(){ System.out.println("before男孩女孩都买自己喜欢的东西"); } @After("myPonit(price)") public void After(double price){ System.out.println("after男孩女孩都买自己喜欢的东西"); } @Around("myPonit(price)") public String testAround(ProceedingJoinPoint px,double price){ try { System.out.println("around....start"); px.proceed(); System.out.println("around....end"); if(price>50){ return "香蕉"; } } catch (Throwable throwable) { throwable.printStackTrace(); } return "橘子"; } }
扩展:Spring注解常用汇总
使用注解之前要开启自动扫描功能
其中base-package为需要扫描的包(含子包)
<context:component-scan base-package=“cn.test”/>
@Configuration把一个类作为一个IoC容器,它的某个方法头上如果注册了@Bean,就会作为这个Spring容器中的Bean。
@Scope注解 作用域
@Lazy(true) 表示延迟初始化
@Service用于标注业务层组件、
@Controller用于标注控制层组件(如struts中的action)
@Repository用于标注数据访问组件,即DAO组件。
@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
@Scope用于指定scope作用域的(用在类上)
@PostConstruct用于指定初始化方法(用在方法上)
@PreDestory用于指定销毁方法(用在方法上)
@Resource 默认按名称装配,当找不到与名称匹配的bean才会按类型装配。
@DependsOn:定义Bean初始化及销毁时的顺序
@Primary:自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常。(只对接口的多个实现生效)
@Autowired 默认按类型装配,如果我们想使用按名称装配,可以结合@Qualifier注解一起使用
@Autowired @Qualifier(“personDaoBean”) 存在多个实例配合使用