文章目录
12.Bean使用拾遗(二)1. Autowired/Resource/Inject2. Componet-scan3. DefaultListableBeanFactory动态添加Bean
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>