12.Bean使用拾遗(二)
1. Autowired/Resource/Inject
- @Autowired byType, 有required属性
- @Resource(Java Content depentment inject standard JSR-299) by name, 无required属性
- @Inject(Java Content depentment inject standard JSR-250) byType, 无required属性
2. Componet-scan
<?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:context="http://www.springframework.org/schema/context"
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"
default-autowire="default">
<context:component-scan base-package="com.desmond.springlearning.component_scan">
<context:include-filter type="aspectj" expression="com.desmond.springlearning.component_scan..*Service+"/>
<context:exclude-filter type="regex" expression="com.desmond.springlearning.component_scan.dao.*"/>
</context:component-scan>
</beans>
package com.desmond.springlearning.component_scan.dao;
import lombok.Data;
@Data
public class DemoDao {
private String name;
public DemoDao() {
this.name = "dao";
}
}
package com.desmond.springlearning.component_scan.service;
import lombok.Data;
@Data
public class Demo2Service {
private String name;
public Demo2Service() {
this.name = "service";
}
}
package com.desmond.springlearning.component_scan.service;
public class DemoService {
}
package com.desmond.springlearning.component_scan;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
public class Test {
public static void main(String[] args) {
Resource resource = new ClassPathResource("component_scan/application.xml");
XmlBeanFactory xmlBeanFactory = new XmlBeanFactory(resource);
System.out.println(xmlBeanFactory.containsBean("demoDao"));
System.out.println(xmlBeanFactory.containsBean("demo2Service"));
System.out.println(xmlBeanFactory.containsBean("demoService"));
}
}
output:
false
true
true
3. DefaultListableBeanFactory动态添加Bean
package com.desmond.springlearning.dynamica_bean;
import lombok.Data;
@Data
public class UserDao {
private String name;
}
package com.desmond.springlearning.dynamica_bean;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserService {
private UserDao userDao;
}
package com.desmond.springlearning.dynamica_bean;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
public class UserServiceFactory implements BeanFactoryPostProcessor {
public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
DefaultListableBeanFactory factory = (DefaultListableBeanFactory) configurableListableBeanFactory;
BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(UserService.class);
beanDefinitionBuilder.addPropertyReference("userDao", "userDao");
factory.registerBeanDefinition("userService1", beanDefinitionBuilder.getRawBeanDefinition());
factory.registerSingleton("userService2", new UserService());
}
}
package com.desmond.springlearning.dynamica_bean;
import com.desmond.springlearning.method_replace.Boss1;
import com.desmond.springlearning.method_replace.Boss2;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.cglib.core.DebuggingClassWriter;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
public class Test {
public static void main(String[] args) {
ApplicationContext factory = new ClassPathXmlApplicationContext("listable/application.xml");
UserService userService1 = (UserService)factory.getBean("userService1");
UserService userService2 = (UserService)factory.getBean("userService2");
System.out.println(userService1);
}
}
<?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:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"
default-autowire="default">
<bean id="userServiceFactory" class="com.desmond.springlearning.dynamica_bean.UserServiceFactory"/>
<bean id="userDao" class="com.desmond.springlearning.dynamica_bean.UserDao" p:name="from xml"/>
</beans>