002-Spring4 快速入門【容器裝配】
一、項目搭建
1、項目創建
eclipse→project explorer→new→Project→Maven Project
默認配置即可創建項目
2、spring配置
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.3.13.RELEASE</View Codeversion> </dependency>
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.targetView Code> </properties>
在項目上右鍵→maven→update project即可
二、基於註解的開發bean,Bean創建和裝配
1、增加配置類,創建Bean
方法一、創建bean
增加註解@Configuration、@Bean、@Scope
@Configuration public class MyConfig { @Bean(name="myBean") @Scope("prototype") public MyBean createMyBean() {View Codereturn new MyBean(); } }
方法二、使用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 快速入門【容器裝配】