bean的加载方式(1)
1.<bean/>
标签
通过xml配置来注入bean
1 2 3 4 5 6 7 8 9 10 11 12 13
| <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="cat" class="com.xw.bean.Cat"/> <bean class="com.xw.bean.Dog"/>
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"/> <bean class="com.alibaba.druid.pool.DruidDataSource"/> <bean class="com.alibaba.druid.pool.DruidDataSource"/> </beans>
|
获取bean
1 2 3 4 5 6 7 8 9
| public class App { public static void main(String[] args) { ApplicationContext app = new ClassPathXmlApplicationContext("spring-config.xml"); String[] names = app.getBeanDefinitionNames(); for (String name : names) { System.out.println(name); } } }
|
结果
1 2 3 4 5
| cat com.xw.bean.Dog#0 dataSource com.alibaba.druid.pool.DruidDataSource#0 com.alibaba.druid.pool.DruidDataSource#1
|
2.注解定义bean
可以使用的注解有@Component以及三个衍生注解@Service、@Controller、@Repository。
1 2 3
| @Component("jerry") public class Mouse { }
|
加载第三方bean时可通过@bean来注入
1 2 3 4 5 6 7 8
| @Component public class DbConfig { @Bean public DruidDataSource dataSource(){ DruidDataSource ds = new DruidDataSource(); return ds; } }
|
最后记得开启注解扫描
1 2 3 4 5 6 7 8 9 10 11 12 13
| <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd "> <context:component-scan base-package="com.xw.bean,com.xw.config"/> </beans>
|
3.@ComponentScan扫描bean
使用FactoryBean接口
造出来的bean并不是DogFactoryBean,而是Dog
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| public class DogFactoryBean implements FactoryBean<Dog> { @Override public Dog getObject() throws Exception { Dog d = new Dog(); return d; } @Override public Class<?> getObjectType() { return Dog.class; } @Override public boolean isSingleton() { return true; } }
|
定义一个类并使用**@ComponentScan**替代原始xml配置中的包扫描这个动作
1 2 3 4 5 6 7 8
| @ComponentScan({"com.xw.bean","com.xw.config"}) public class SpringConfig3 { @Bean public DogFactoryBean dog(){ return new DogFactoryBean(); } }
|
通过AnnotationConfigApplicationContext获取bean
1 2 3 4 5 6 7 8 9
| public class App3 { public static void main(String[] args) { ApplicationContext app = new AnnotationConfigApplicationContext(SpringConfig3.class); String[] names = app.getBeanDefinitionNames(); for (String name : names) { System.out.println(name); } } }
|
补充
可用**@ImportResource**将xml配置文件中的bean和配置类中的bean融合在一起,在配置类上直接写上要被融合的xml配置文件名即可,算的上一种兼容性解决方案
1 2 3 4
| @Configuration @ImportResource("applicationContext1.xml") public class SpringConfig3 { }
|
@Configuration注解的proxyBeanMethods属性,此属性默认值为true,若设为false,则表示注入到容器中的对象不再是唯一的
1 2 3 4 5 6 7
| @Configuration(proxyBeanMethods = true) public class SpringConfig3 { @Bean public Cat cat(){ return new Cat(); } }
|
4.@Import指定bean
通过@Import可指定要注入的bean,不需要在bean上加注解
1 2 3
| @Import(Dog.class) public class SpringConfig4 { }
|
获取bean
1 2 3 4 5 6 7 8 9
| public class App4 { public static void main(String[] args) { ApplicationContext app = new AnnotationConfigApplicationContext(SpringConfig4.class); String[] names = app.getBeanDefinitionNames(); for (String name : names) { System.out.println(name); } } }
|
结果
1 2
| springConfig4 com.xw.bean.Dog
|