bean的加载方式(1)

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">
<!--xml方式声明自己开发的bean-->
<bean id="cat" class="com.xw.bean.Cat"/>
<bean class="com.xw.bean.Dog"/>

<!--xml方式声明第三方开发的bean-->
<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(); // 获取容器中所有bean的名称
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")	//可以给bean起个名字
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
">
<!--指定扫描加载bean的位置-->
<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(){
//通过FactoryBean来注入,可以在对象初始化前做一些事情
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

bean的加载方式(1)
http://xwww12.github.io/2022/07/22/spring/bean的加载方式(1)/
作者
xw
发布于
2022年7月22日
许可协议