1. 程式人生 > >002-Spring4 快速入門【容器裝配】

002-Spring4 快速入門【容器裝配】

裝配 use lean target .get rgs clas red tex

一、項目搭建

1、項目創建

eclipse→project explorer→new→Project→Maven Project

默認配置即可創建項目

2、spring配置

技術分享圖片
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.3.13.RELEASE</
version> </dependency>
View Code

3、配置項目編譯目標版本

技術分享圖片
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target
> </properties>
View Code

在項目上右鍵→maven→update project即可

二、基於註解的開發bean,Bean創建和裝配

1、增加配置類,創建Bean

方法一、創建bean

增加註解@Configuration、@Bean、@Scope

技術分享圖片
@Configuration
public class MyConfig {
    @Bean(name="myBean")
    @Scope("prototype")
    public MyBean createMyBean() {
        
return new MyBean(); } }
View Code

方法二、使用FactoryBean創建,lambda方式

技術分享圖片
public class RunnableFactoryBean implements FactoryBean<Runnable>{

    @Override
    public Runnable getObject() throws Exception {
        return ()->{};
    }

    @Override
    public Class<?> getObjectType() {
        return Runnable.class;
    }

    @Override
    public boolean isSingleton() {
        return true;
    }
}
View Code

如定義一個Jeep,講工廠類改成

技術分享圖片
public class RunnableFactoryBean implements FactoryBean<Jeep>{

    @Override
    public Jeep getObject() throws Exception {
        return new Jeep();
    }

    @Override
    public Class<?> getObjectType() {
        return Jeep.class;
    }

    @Override
    public boolean isSingleton() {
        return true;
    }
}
View Code

使用即可。

方法三、需要參數,默認會獲取,自動註入

創建class Car

創建一個工廠

技術分享圖片
public class CarFactory {
    public Car create() {
        return new Car();
    }
}
View Code

在Config中添加

技術分享圖片
    @Bean
    public CarFactory createCarFactory() {
        return new CarFactory();
    }
    
    @Bean
    public Car createCar(CarFactory factory) {
        return factory.create();
    }
View Code

使用即可:System.out.println(annotationConfigApplicationContext.getBean(Car.class));//名稱獲取

2、在方法入口增加配置

方法一、配置一個或多個指定的類型

AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(MyConfig.class);

方法二、配置指定掃描的包

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext("com.lhx.spring.spring");

方法三、配置指定包,並且排除

@ComponentScan(basePackages="com.lhx.spring.spring",excludeFilters=@Filter(type=FilterType.ASSIGNABLE_TYPE))

FilterType有五種類型

ANNOTATION、ASSIGNABLE_TYPE、ASPECTJ、REGEX、CUSTOM

使用

建一個Dog類

技術分享圖片
public class Dog {
    public void init() {
        System.out.println("--------init------");
    }

    public void destory() {
        System.out.println("--------destory------");
    }
}
View Code

增加一個DogConfig配置類

技術分享圖片
@Configuration
public class DogConfig {

    @Bean(initMethod = "init", destroyMethod = "destory")
    public Dog createDog() {
        return new Dog();
    }
}
View Code

增加一個掃描配置類

技術分享圖片
@ComponentScan(basePackages="com.lhx.spring.spring",excludeFilters=@Filter(type=FilterType.ASSIGNABLE_TYPE,classes=DogConfig.class))
@Configuration
public class AnnotationScan {

}
View Code

  當然也可以直接指定有註解的類類型,如UserController.class

使用

技術分享圖片
public class AnnotationClient2 {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AnnotationScan.class);
        System.out.println(context.getBean(Car.class));
        System.out.println(context.getBean(Cat.class));
        System.out.println(context.getBean(Dog.class));
        System.out.println(context.getBean(Animal.class));
        System.out.println(context.getBean(User.class));
        context.close();
    }

}
View Code

3、獲取Bean

3.1、根據類型獲取

System.out.println(annotationConfigApplicationContext.getBean(MyBean.class));

3.2、根據名稱獲取

System.out.println(annotationConfigApplicationContext.getBean("createMyBean"));//默認是方法名

註意:默認是1中配置的方法名

也可以再註解Bean中指定:@Bean(name="myBean"),指定後默認方法名不能使用

System.out.println(annotationConfigApplicationContext.getBean("myBean"));// 指定具體名

其中:默認是單例,@Scope("prototype") 非單例了

如1,方法二、展示

    System.out.println(annotationConfigApplicationContext.getBean(Jeep.class));
    System.out.println(annotationConfigApplicationContext.getBean("createRunnableFactoryBean"));

這個是具體的bean,如何獲取工程bean

    System.out.println(annotationConfigApplicationContext.getBean(RunnableFactoryBean.class));//類型獲取
    System.out.println(annotationConfigApplicationContext.getBean("&createRunnableFactoryBean"));//名稱獲取

&能獲取原因:AnnotationConfigApplicationContext→GenericApplicationContext→AbstractApplicationContext→

ConfigurableApplicationContext→ApplicationContext→ListableBeanFactory→BeanFactory

技術分享圖片

三、基於註解的開發bean,Bean初始化銷毀

1、初始化實現InitializingBean,銷毀實現DisposableBean

技術分享圖片
public class Cat  implements InitializingBean,DisposableBean{

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("----------afterPropertiesSet--------");        
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("----------destroy--------");        
    }
}
View Code

2、註入時候實現,

在類中頂一個init,destory,在Config配置中@Bean配置;

技術分享圖片
    @Bean(initMethod="init",destroyMethod="destory")
    public Dog createDog() {
        return new Dog();
    }
View Code

3、使用java中,jsr250提供的註解,@PostConstruct,@PreDestroy

技術分享圖片
public class Animal {
    @PostConstruct
    public void initial() {
        System.out.println("--------initial------");
    }

    @PreDestroy
    public void close() {
        System.out.println("--------close------");
    }
}
View Code

四、Bean裝配,註解

1、使用@Component註解,沒有明確角色

在class 上增加@Component註解,在AnnotationConfigApplicationContext,參數中添加即可。

AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(
                MyConfig.class,User.class);

使用即可。註意:沒法綁定初始化方法等。

        System.out.println(annotationConfigApplicationContext.getBean(User.class));
        System.out.println(annotationConfigApplicationContext.getBean("user"));

可以通過getBeansOfType獲取類型Map

System.out.println(annotationConfigApplicationContext.getBeansOfType(User.class));

{user=com.lhx.spring.spring.User@5e57643e}

如果在通過Config註入,那麽獲取時候不能使用類型獲取了,有多個不知道創建那個,可以使用名稱獲取

2、可以使用其他註解

@Repository 一般用在數據訪問層

@Service 一般用在Service層

@Controller 一般用在控制層

五、Bean依賴註入

5.1、Spring方式,@Autowired

    @Autowired
    private UserDao userDao;

如果有多個

1、名稱方式,可以使用getBeansOfType獲取名稱,然後指定名稱註入

    @Autowired
    @Qualifier("userDao")
    private UserDao userDao;

2、在其中某個增加@Primary,默認就會找這個。

5.2、jsr 250 方式,@Resource

5.3、jsr 330方式,@Inject

<dependency>
    <groupId>javax.inject</groupId>
    <artifactId>javax.inject</artifactId>
    <version>1</version>
</dependency>

代碼地址:https://github.com/bjlhx15/spring-boot.git

002-Spring4 快速入門【容器裝配】