Spring基础及组件使用(Configuration,ComponentScan,Scope,lazy)

直接上代码:

public class Person{
    
    private String name;
    private Integer age;

    public Person(){
        super();
    }
    
    public Person(String name,Integer age){
        super();
        this.name = name;
        this.age = age;
    }
    get  set ..... 方法省略 
}

创建配置文件 命名为beans.xml。使用bean标签注册一些组件《新建Person.java》。


    
    

新建 Test 测试类 :ClassPathXmlApplicationContext:类路径下的xml:

public class Test{

    public static void main(String [] args){
        
           ApplicationContext app = new ClassPathXmlApplicationContext("beans.xml");
           Person person = (Person) app.getBean("person");
           System.out.println(person);
    }
}

如今项目多数都用注解开发,很明显已经不需要xml的。

注解测试:如何使用注解(去掉配置文件)开发   Configuration配置注解

新建MainConfig

//配置类 ===== 配置文件
@Configuration
public class MainConfig{

    //给容器中注册一个bean,类型为返回值类型
    @Bean("abcPerson")
    public Person person01(){
   
        return new Person("zhangy",24);
    }
}

注解测试:新建Test2注解测试,用来测试//AnnoatationConfigApplicationContext: 注解配置来获取IOC容器

public class Test2{

        public static void main (String[] args){
        
        ApplicationContext app = new AnnotationConfigApplicationContext(MainConfig.class);
        
        //person();方法名默认为bean的id
        //    如何改bean的id值
        //1.将person()改为person01(),此时bean的id为person01
        //2.直接在MainConfig类的@Bean("你要的bean名字")
        
        String namesForBean = app.getBeanNamesForType(Person.class);
        for(String name : namesForBean){
            System.out.println(name);
        }
    }


}

 

 

    ComponentScan扫描规则

操作:新建cap2文件夹,新建Cap2MainConfig.java配置类

作用:指定要扫描的包

Spring基础及组件使用(Configuration,ComponentScan,Scope,lazy)_第1张图片

 

 

1,@ComponentScan(value="com.enjoy.cap2")表示扫描此目录下的包

2,建立测试用例方法;

Spring基础及组件使用(Configuration,ComponentScan,Scope,lazy)_第2张图片

 新建Cap2MainConfig2配置类

作用:定制包扫描时的过滤规则

新建dao, service,controller

Spring基础及组件使用(Configuration,ComponentScan,Scope,lazy)_第3张图片Spring基础及组件使用(Configuration,ComponentScan,Scope,lazy)_第4张图片

 

Cap2MainConfig2加入配置: @Filter: 扫描规则

 @ComponentScan(value="com.enjoy.cap2",includeFilters={        @Filter(type=FilterType.ANNOTATION,classes={Controller.class}),        @Filter(type=FilterType.ASSIGNABLE_TYPE,classes={BookService.class})

},useDefaultFilters=false) //默认是true,扫描所有组件,要改成false,使用自定义扫描范围

*/

//@ComponentScan value:指定要扫描的包

//excludeFilters = Filter[] 指定扫描的时候按照什么规则排除那些组件

//includeFilters = Filter[] 指定扫描的时候只需要包含哪些组件

//useDefaultFilters = false 默认是true,扫描所有组件,要改成false

//----扫描规则如下

//FilterType.ANNOTATION:按照注解

//FilterType.ASSIGNABLE_TYPE:按照给定的类型;比如按BookService类型

//FilterType.ASPECTJ:使用ASPECTJ表达式

//FilterType.REGEX:使用正则指定

//FilterType.CUSTOM:使用自定义规则,自已写类,实现TypeFilter接口

 

//FilterType.CUSTOM的例子,常用

先新增自定义过滤规则类:

Spring基础及组件使用(Configuration,ComponentScan,Scope,lazy)_第5张图片

Cap2MainConfig申明

@ComponentScan(value="com.enjoy.cap2",includeFilters={

        @Filter(type=FilterType.CUSTOM,classes={JamesTypeFilters.class})

},useDefaultFilters=false)

public class Cap2MainConfig2 {}

 

Spring基础及组件使用(Configuration,ComponentScan,Scope,lazy)_第6张图片

 

scope扫描规则

1,新建Cap3MainConfig.java

Spring基础及组件使用(Configuration,ComponentScan,Scope,lazy)_第7张图片

2,没加@Scope之前, 默认的bean是单实例的. 新建 test01()方法测试如下:

Spring基础及组件使用(Configuration,ComponentScan,Scope,lazy)_第8张图片

返回true, 证明取到的是同一个person bean,只实例化了一次.

 

3, 加入@Scope(“prototype”) //多实例

prototype: 多实例:IOC容器启动并不会去调用方法创建对象放在容器中,而是                                                                  每次获取的时候才会调用方法创建对象,见test02

singleton: 单实例(默认):IOC容器启动会调用方法创建对象放到IOC容器中

以后每交获取就是直接从容器(理解成从map.get对象)中拿 

request:  主要针对WEB应用,同一次请求创建一个实例

session:  同一个session创建一个实例(后面两个用得不多,了解即可

 

lazy懒加载

1,新建Cap4MainConfig.java

 

Spring基础及组件使用(Configuration,ComponentScan,Scope,lazy)_第9张图片

2,建立测试用例test01();

Spring基础及组件使用(Configuration,ComponentScan,Scope,lazy)_第10张图片

当在Cap4MainConfig加入@Lazy只有获取anno.getBean时才会加载到IOC容器中

 

 

 

 

你可能感兴趣的:(Spring)