说白了就是创建对象交给spring管理 或者让spring帮你创建这个对象
本文将以最详细的方式一一列举
xml中直接定义bean 通过其构造函数创建bean
<?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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- xml 中bean创建的几种方式 -->
<!--1、直接定义bean -->
<bean id="myBean1" class="com.lgj.spring.createbean.xml.MyBean1"/>
</beans>
利用factorybean
<?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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!--2、利用factorybean -->
<bean id="myBean2" class="com.lgj.spring.createbean.xml.MyFactoryBean"/>
</beans>
public class MyFactoryBean implements FactoryBean<MyBean1> {
@Override
public MyBean1 getObject() throws Exception {
return new MyBean1();
}
@Override
public Class<?> getObjectType() {
return MyBean1.class;
}
}
静态方法创建bean
<?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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!--3、静态方法创建bean -->
<bean id="myBean3" class="com.lgj.spring.createbean.xml.MyBeanInXml" factory-method="createSMybean1"/>
</beans>
public class MyBeanInXml {
/**
* 静态方法创建bean
*/
public static MyBean1 createSMybean1(){
return new MyBean1();
}
}
非静态方法创建bean
<?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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!--4、普通实例化方法创建bean -->
<bean id="factoryBean" class="com.lgj.spring.createbean.xml.MyBeanInXml"/>
<bean id="myBean4" factory-bean="factoryBean" factory-method="createMybean1"/>
</beans>
public class MyBeanInXml {
/**
* 非静态方法创建bean
*/
public MyBean1 createMybean1(){
return new MyBean1();
}
}
利用常用注解@Component、@Service等等
@Component
public class MyBean {
}
利用@Bean注解
@Bean
public MyBean1 myBean1(){
return new MyBean1();
}
利用import注解 直接引入该类
@Import(MyBean2.class)
利用import注解 的ImportSelector
public class MyImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[] {MyBean3.class.getName()};
}
}
@Import(MyImportSelector.class)
利用import注解 的ImportBeanDefinitionRegistrar 注入beanDefinition
public class MyImportRegistrar implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
RootBeanDefinition bd = new RootBeanDefinition();
bd.setBeanClass(MyBean4.class);
registry.registerBeanDefinition("myRegistrarBean4", bd);
}
}
@Import(MyImportRegistrar.class)
利用beanFactoryPostProcessor 注入beanDefinition
@Component
public class MyBeanFactoryBeanProcessor extends ConfigurationClassPostProcessor {
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) {
RootBeanDefinition bd = new RootBeanDefinition();
bd.setBeanClass(MyBean5.class);
registry.registerBeanDefinition("registerBeanDefinition",bd);
}
}
利用beanFactory 注入beanDefinition
@Component
public class MyBeanFactory implements BeanFactoryAware {
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
DefaultListableBeanFactory listableBeanFactory = (DefaultListableBeanFactory)beanFactory;
RootBeanDefinition bd = new RootBeanDefinition(MyBean6.class);
listableBeanFactory.registerBeanDefinition("byBeanFactory",bd);
}
}
自定义bean标签 还是注入beanDefinition
\src\main\resources\META-INF目录下新建三个文件:
1、spring.handlers
http\://www.custombean.com/schema/user=com.lgj.spring.createbean.xml.customtag.MyCustomTagHandler
2、spring.schemas
http\://www.custombean.com/schema/user.xsd=META-INF/spring-user.xsd
3、spring-user.xsd
<?xml version="1.0" encoding="UTF-8" ?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.custombean.com/schema/user"
elementFormDefault="qualified">
<element name="user">
<complexType>
<attribute name="id" type="string"></attribute>
<attribute name="username" type="string"></attribute>
<attribute name="password" type="string"></attribute>
<attribute name="age" type="int"></attribute>
</complexType>
</element>
</schema>
MyCustomTagHandler
public class MyCustomTagHandler extends NamespaceHandlerSupport {
@Override
public void init() {
registerBeanDefinitionParser("user",new UserBeanDefinitionParser());
}
}
User
public class User {
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
private String id;
private String username;
private String password;
private int age;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"id='" + id + '\'' +
", username='" + username + '\'' +
", password='" + password + '\'' +
", age=" + age +
'}';
}
}
UserBeanDefinitionParser
public class UserBeanDefinitionParser extends AbstractSingleBeanDefinitionParser {
@Override
protected Class<?> getBeanClass(Element element) {
return User.class;
}
@Override
protected void doParse(Element element, BeanDefinitionBuilder builder) {
String id = element.getAttribute("id");
String username = element.getAttribute("username");
String age = element.getAttribute("age");
String password = element.getAttribute("password");
builder.addPropertyValue("id",id);
builder.addPropertyValue("username",username);
builder.addPropertyValue("password",password);
builder.addPropertyValue("age",age);
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:test="http://www.custombean.com/schema/user"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.custombean.com/schema/user
http://www.custombean.com/schema/user.xsd">
<!--自定义标签-->
<test:user id="customTag" username="test" password="password1" age="13"/>
</beans>
附启动类
public class CreateBeanMain {
public static void main(String[] args) {
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:createBeanContext.xml");
System.out.println(applicationContext.getBean("myBean1"));
System.out.println(applicationContext.getBean("myBean2"));
System.out.println(applicationContext.getBean("myBean3"));
System.out.println(applicationContext.getBean("myBean4"));
System.out.println(applicationContext.getBean("customTag").toString());
}
}
public class CreateBeanWithAnnoMain {
public static void main(String[] args) {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(CreateBeanConfig.class);
//1、利用bean注解
System.out.println(applicationContext.getBean("myBean1"));
//2、利用component等相关注解
System.out.println(applicationContext.getBean("myBean"));
//3、利用import注解 直接引入该类
System.out.println(applicationContext.getBean(MyBean2.class));
//4、利用import注解 的ImportSelector
System.out.println(applicationContext.getBean(MyBean3.class));
//5、利用import注解 的ImportBeanDefinitionRegistrar 注入beanDefinition
System.out.println(applicationContext.getBean("myRegistrarBean4"));
//6、利用beanFactoryPostProcessor
System.out.println(applicationContext.getBean("registerBeanDefinition"));
//7、利用beanFactory 注入beanDefinition
System.out.println(applicationContext.getBean("byBeanFactory"));
}
}
@Configuration
@ComponentScan("com.lgj.spring.createbean.annotation")
@Import({MyBean2.class,MyImportSelector.class,MyImportRegistrar.class})
public class CreateBeanConfig {
@Bean
public MyBean1 myBean1(){
return new MyBean1();
}
}
如有遗漏 欢迎补充