目录
准备工作
1 创建maven工程
(不选spring initializr,选maven)
2 添加 spring-context 的依赖
添加druid依赖是为了测试 定义第3方开发的bean
<!-- 添加依赖-->
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.9</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.6</version>
</dependency>
</dependencies>
3 创建bean
一 使用xml方式定义bean
1 创建 spring config类型的配置文件
里面声明bean
resources--applicationContext1.xml
<?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.qing.bean.Cat"/>
<bean class="com.qing.bean.Dog"/>
<bean class="com.qing.bean.Dog"/>
<!-- xml形式声明第3方开发的bean-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"/>
</beans>
2 读取配置文件,获取bean
package com.qing.app;
import com.qing.bean.Dog;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class App1 {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext1.xml");
Object cat = ctx.getBean("cat");
System.out.println(cat);
// Object dog = ctx.getBean(Dog.class);
// System.out.println(dog);
System.out.println("==========");
String[] names = ctx.getBeanDefinitionNames();
for (String name: names) {
System.out.println(name);
}
}
}
结果
备注: #0 #1 ,是因为 没给配置文件里的bean起id, spring自动给了他名字,然后为了区分加了 #0 #1 编号
总结
二 xml+注解方式定义bean
2.1 加载自己开发的bean
1 bean上加@Component注解
package com.qing.bean;
import org.springframework.stereotype.Component;
//即id为"jerry"的bean
@Component("jerry")
public class Mouse {
}
package com.qing.bean;
import org.springframework.stereotype.Service;
@Service
public class Cat {
}
2 配置文件加上搜索bean的范围
<?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的位置 component-->
<context:component-scan base-package="com.qing.bean"/>
</beans>
3 范围内扫描获取bean
package com.qing.app;
import com.qing.bean.Cat;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class App2 {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext2.xml");
Object jerry = ctx.getBean("jerry");
System.out.println(jerry);
Object cat = ctx.getBean(Cat.class);
System.out.println(cat);
System.out.println("==========");
String[] names = ctx.getBeanDefinitionNames();
for (String name: names) {
System.out.println(name);
}
}
}
结果
2.2 加载第三方的bean
1 创建一个配置类
加@Configuration注解
写一个方法返回第三方的bean
package com.qing.config;
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
//@Component
//备注:@Configuration 就是 @Component,他俩几乎没有区别
@Configuration
public class DBconfig {
@Bean
public DruidDataSource druidDataSource(){
return new DruidDataSource();
}
}
备注:@Bean → 注入当前方法的 返回值 ,存入spring 的IOC 容器中
2 配置文件加上搜索bean的范围
<?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的位置 component-->
<context:component-scan base-package="com.qing.bean,com.qing.config"/>
</beans>
3 范围内扫描获取bean
package com.qing.app;
import com.qing.bean.Cat;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class App2 {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext2.xml");
Object jerry = ctx.getBean("jerry");
System.out.println(jerry);
Object cat = ctx.getBean(Cat.class);
System.out.println(cat);
System.out.println("==========");
String[] names = ctx.getBeanDefinitionNames();
for (String name: names) {
System.out.println(name);
}
}
}
结果
备注:@Configuration 就是 @Component,他俩几乎没有区别
总结:
三 使用全注解方式定义bean
1 写一个配置类把配置文件干掉
告诉spring扫描的范围
package com.qing.config;
import org.springframework.context.annotation.ComponentScan;
@ComponentScan({"com.qing.bean","com.qing.config"})
public class SpringConfig3 {
}
2 把bean放入spring容器
bean上加@Component注解
or 创建一个配置类:加@Configuration注解,写一个方法返回第三方的bean
(同 二 xml+注解方式定义bean 一样,此处省略)
3 获取bean
用这个new AnnotationConfigApplicationContext() 读取配置类
package com.qing.app;
import com.qing.bean.Cat;
import com.qing.config.SpringConfig3;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class App3 {
public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig3.class);
Object jerry = ctx.getBean("jerry");
System.out.println(jerry);
Object cat = ctx.getBean(Cat.class);
System.out.println(cat);
System.out.println("==========");
String[] names = ctx.getBeanDefinitionNames();
for (String name: names) {
System.out.println(name);
}
}
}
结果
如果是获取第三方的bean,两个配置类可以合在一起如下:
package com.qing.config;
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
@ComponentScan({"com.qing.bean","com.qing.config"})
public class SpringConfig3 {
@Bean
public DruidDataSource druidDataSource(){
return new DruidDataSource();
}
}