spring注解
spring认为所有的组件,都应该放在spring容器中,组件通过容器进行自动装配
- spring最基本的写法
<bean id="myspring" class="com.spring.Person"> <property name="age" value="10"></property> <property name="name" value="zhangsan"></property> </bean> 1.加上classpath:前缀(这个时候xml要放在当前目录也就是src下) ApplicationContext ctx=new FileSystemXmlApplicationContext("classpath:applicationContext.xml"); 2.加上file:把路径写全(用这个方法xml可以放任意地方) ApplicationContext ctx=new ClassPathXmlApplicationContext("ApplicationContext ctx=new ClassPathXmlApplicationContext("file:F:/workspace/SpringExercis/src/applicationContext.xml");
2.使用注解的方式
```java
@Configuration//告诉Spring,这是一个配置类
public class MainConfig {
@Bean //给容器注入一个bean,类型为返回值的类型,id,默认使用方法名作为id,bean可以指定value属性
public Person person(){
return new Person("lisi",20);
}
}
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
Person person = applicationContext.getBean(Person.class);
System.out.println(person);
3.componentScan(value=“com.spring”) 注解
原始写法:配置文件中加入
<!--只要标注 了@Controller,@Service,@Repository,@Component ,会被自动扫描,加入到容器-->
<context:component-scan base-package="com.spring"></context:component-scan>
注解写法:
@Configuration//告诉Spring,这是一个配置类
@ComponentScan(value = "com.spring" ,excludeFilters = {
@ComponentScan.Filter(type = FilterType.ANNOTATION ,classes = {
Controller.class
} )
})
public class MainConfig {
public class MainConfig {
componentScan 也可以配置如下方法(点击ComponentScan)
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
@Repeatable(ComponentScans.class)
public @interface ComponentScan {
@AliasFor("basePackages")
String[] value() default {};
@AliasFor("value")
String[] basePackages() default {};
Class<?>[] basePackageClasses() default {};
Class<? extends BeanNameGenerator> nameGenerator() default BeanNameGenerator.class;
Class<? extends ScopeMetadataResolver> scopeResolver() default AnnotationScopeMetadataResolver.class;
//ASSIGNABLE_TYPE 指定包含的类型,包括子类,实现类
ScopedProxyMode scopedProxy() default ScopedProxyMode.DEFAULT;
String resourcePattern() default "**/*.class";
boolean useDefaultFilters() default true;//使用exclude时需设置为false
ComponentScan.Filter[] includeFilters() default {};
ComponentScan.Filter[] excludeFilters() default {};
java8 componentScan 支持重复注解,如果不是java8,则可以使用ComponentScans,同时支持自定义的扫描规则
3.@Scope -设置组件的作用域
ion 容器,默认是单实例对象
@Scope(“singleton”)
IOC容器启动会创建对象放到容器中,以后每次获取,直接从容器获取
@Scope(“prototype”)//多实例对像,每次获取,才会调用
4.@Lazy-懒加载注解
懒加载针对于单实例对象,默认在容器启动的时候创建对象
@Lazy 添加后,容器启动,不创建对象,在第一次获取对象的时候创建