这属于最简单的博文了。Bean的声明在spring有多种方式,可以这样分:
1. 组件注解方式,有@Component, @Service,@Repository,@Controller等注解,此外还可以自定义注解。
2. @Bean注解方式
3. XML配置方式,主要包含构造器,静态工厂与动态工厂三种方式。
1 准备工作
因为我们学习的是spring,所以不要加入任何spring boot的包,这样才能深刻地掌握原理。maven依赖如下:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.14</version>
</dependency>
2 组件注解方式
写一个java bean,上面加上注解
package com.youngthing.springfreamework.demo;
import org.springframework.stereotype.Component;
/**
* 一个简单的Bean
* created at 15/03/2022
*
* @author 花书粉丝
* <a href="mailto://yujianbo@chtwm.com">yujianbo@chtwm.com</a>
* @since 1.0.0
*/
@Component
public class HelloBean {
public String greeting() {
return "Hello, world!";
}
}
在main函数中使用AnnotationConfigApplicationContext来使用注解容器,并且类上加@ComponentScan注解去扫描包。
package com.youngthing.springfreamework.demo;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;
/**
* 主函数
* created at 15/03/2022
*
* @author 花书粉丝
* <a href="mailto://yujianbo@chtwm.com">yujianbo@chtwm.com</a>
* @since 1.0.0
*/
@ComponentScan("com.youngthing.springfreamework.demo")
public class Main {
public static void main(String[] args) {
final AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(
Main.class);
final HelloBean bean = context.getBean(HelloBean.class);
System.out.println(bean.greeting());
}
}
如此,完成了。其他的注解也是一样的。这里不再重复实验。
3. @Bean注解方式
这种方式也比较简单。无非是使用注解而已。并且bean的名称与方法名一致。以下是一个简单的demo。使用这种方式的好处是可以定义多个同类型,但是不同内容的bean。还有一个好处是第三方的提供的类,我们无法修改他们的代码来加@Component注解,就可以使用这种方式声明并创建bean了。
public class BeanAnnotationDemo {
@Bean
public Pattern numPattern() {
return Pattern.compile("\\d+");
}
public static void main(String[] args) {
final AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(
Main.class);
final Pattern bean = context.getBean("numPattern", Pattern.class);
System.out.println(bean.matcher("12234").find());
}
}
4. XML方式
XML方式已经被时代淘汰了。如果不感兴趣可以跳过这段。
4.1 XML构造器方式
先定义一个实体类。
package com.youngthing.springfreamework.demo;
/**
* 一个简单的Bean
* created at 15/03/2022
*
* @author 花书粉丝
* <a href="mailto://yujianbo@chtwm.com">yujianbo@chtwm.com</a>
* @since 1.0.0
*/
public class XmlBean {
public String greeting() {
return "Hello, world!";
}
}
然后在resources文件夹里写一个application.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-2.5.xsd">
<bean class="com.youngthing.springfreamework.demo.XmlBean"/>
</beans>
写好main函数就可以启动spring的xml容器了。
public class XmlDemo {
public static void main(String[] args) {
final ClassPathXmlApplicationContext ctx = new
ClassPathXmlApplicationContext("application.xml");
final XmlBean bean = ctx.getBean(XmlBean.class);
System.out.printf(bean.greeting());
}
}
4.1 XML静态工厂方式
定义一个静态工厂:
public class RandomFactory {
private static Random random = new Random();
public static int get() {
return random.nextInt(100_0000);
}
}
在XML里这样配置
<bean class="com.youngthing.springfreamework.demo.RandomFactory" name="random"
factory-method="get"></bean>
4.2 XML实例工厂方式
为了简洁,我就不定义类了,直接配置XML,拿java的Random类作为实例工厂,nextInt方法作为工厂方法,工厂方法的参数配置使用<constructor-arg>标签。
<bean class="java.util.Random" id="dynamicFactory"/>
<bean factory-bean="dynamicFactory" factory-method="nextInt" name="randomNumber">
<constructor-arg value="100000"/>
</bean>
然后直接写一个main函数:
public class DynamicFactoryDemo {
public static void main(String[] args) {
final ClassPathXmlApplicationContext ctx = new
ClassPathXmlApplicationContext("application.xml");
final int num = ctx.getBean("randomNumber", Integer.class);
System.out.println(num);
}
}