Spring(二)--FactoryBean、bean的后置处理器、数据库连接池、引用外部文件、使用注解配置bean等
实验1:配置通过静态工厂方法创建的bean [通过静态方法提供实例对象,工厂类本身不需要实例化!]
1.创建静态工厂类
public class StaticFactory { private static HashMap<String, Book> map = null; static{
map = new HashMap<>();
map.put("book01", new Book("java", "you", 33.33));
map.put("book02", new Book("c++", "you", 66.66));
map.put("book03", new Book("c#", "you", 99.99));
} public static Book getBookById(String id){
return map.get(id);
}
}
工厂本身不创建对象,而是通过其提供的静态方法获取对象
<bean id="staticFactory" class="com.neuedu.spring.entity.StaticFactory" factory-method="getBookById">
<constructor-arg value="book02"></constructor-arg>
</bean>
实验2:配置通过实例工厂方法创建的bean [通过实例方法提供实例对象,工厂类本身需要先创建对象!]
public class InstanceFactory { private HashMap<String, Book> map = null; {
map = new HashMap<>();
map.put("book01", new Book("java", "you", 33.33));
map.put("book02", new Book("c++", "you", 66.66));
map.put("book03", new Book("c#", "you", 99.99));
} public Book getBookById(String id){ return map.get(id);
}
}
<bean id="instanceFactory" class="com.neuedu.spring.entity.InstanceFactory"></bean>
<bean id="bookFromInstanceFactory" factory-bean="instanceFactory" factory-method="getBookById">
<constructor-arg value="book03"></constructor-arg>
</bean>
从实例中获取book03
public void test() {
Object bean = ioc.getBean("bookFromInstanceFactory");
System.out.println(bean);
}
实验3:配置FactoryBean
public class MyFactoryBean implements FactoryBean<Book>{ @Override
public Book getObject() throws Exception {
//Spring的IOC容器就是调用该方法返回的对象
return new Book("java", "you", 33.33);
} @Override
public Class<?> getObjectType() {
//返回对象的类型
return Book.class;
} @Override
public boolean isSingleton() {
return true;
}
}
<!-- 配置工厂bean -->
<bean id="myFactoryBean" class="com.neuedu.spring.entity.MyFactoryBean"></bean>
实验4:测试bean的后置处理器
public class MyBeanPostProcessor implements BeanPostProcessor{ @Override
public Object postProcessAfterInitialization(Object object, String beanId) throws BeansException {
System.out.println("After---"+object+"---"+beanId);
return object;
} @Override
public Object postProcessBeforeInitialization(Object object, String beanId) throws BeansException {
System.out.println("Before---"+object+"---"+beanId);
return object;
}
}
没有 bean 对象,后置处理器不会执行
<bean id="myBeanPostProcessor" class="com.neuedu.spring.entity.MyBeanPostProcessor"></bean>
如果只这么写的话,是不会输出什么的
所以在这之前需要创建一个 bean 对象
<bean id="book" class="com.neuedu.spring.entity.Book" init-method="init">
<property name="bookName" value="java"></property>
<property name="author" value="you"></property>
<property name="price" value="32.32"></property>
</bean>
<bean id="myBeanPostProcessor" class="com.neuedu.spring.entity.MyBeanPostProcessor"></bean>

bean对象属性的检查,属性名、属性类型是否规范
数据库连接池:
实验5:引用外部属性文件

<context:property-placeholder location="classpath:jdbc.properties"/> <bean id="comboPooledDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
<property name="driverClass" value="${jdbc.driver}"></property>
<property name="jdbcUrl" value="${jdbc.url}"></property>
</bean>
@Test
public void test() throws SQLException {
DataSource bean = ioc.getBean(DataSource.class);
System.out.println(bean.getConnection());
}
执行查询操作
@Test
public void test() throws SQLException {
DataSource bean = ioc.getBean(DataSource.class);
Connection conn = bean.getConnection();
String sql = "select * from student";
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while(rs.next()){
String name = rs.getString("name");
String email = rs.getString("email");
String school = rs.getString("school");
String score = rs.getString("score");
System.out.println(name+"--"+email+"--"+school+"--"+score);
}
}
补充:
@Controller
public class AController { @Value("${jdbc.username}")
private String username;
//${jdbc.username}将值赋给username
@Value("${jdbc.password}")
private String password; @Value("${jdbc.driver}")
private String driver; @Value("${jdbc.url}")
private String url; @Override
public String toString() {
return "AController [username=" + username + ", password=" + password + ", driver=" + driver + ", url=" + url
+ "]";
}
}
<context:component-scan base-package="com.neuedu"></context:component-scan>
<context:property-placeholder location="classpath:jdbc.properties"/>
@Test
public void test01(){
AController bean = ioc.getBean(AController.class);
System.out.println(bean);
}
实验6:基于XML的属性装配
<!-- 手动装配 -->
<bean id="userService" class="com.neuedu.spring.entity.UserService"></bean>
<bean id="userAction" class="com.neuedu.spring.entity.UserAction">
<property name="userService" ref="userService"></property>
</bean>
<bean id="userService" class="com.neuedu.spring.entity.UserService"></bean>
<bean id="userAction" autowire="byType" class="com.neuedu.spring.entity.UserAction"></bean>
<bean id="userService" class="com.neuedu.spring.entity.UserService"></bean>
<bean id="userAction" autowire="byName" class="com.neuedu.spring.entity.UserAction"></bean>
实验7:使用注解配置bean
<context:component-scan base-package="com.neuedu"></context:component-scan>
@Test
public void test(){
// UserController bean = ioc.getBean(UserController.class);
// Object bean = ioc.getBean("userController");
Object bean = ioc.getBean("asd");
System.out.println(bean);
}
Spring根据上述注解其实并不能分辨当前类是否真的是一个Controller或Dao,因为标记的类和注解不对应也没有语法错误。也就是将 controller层的注解写成@Service 也没错,但在实际工作中,肯定要将专门的注解标记在对应的类上面。
实验8:通过注解分别创建Dao、Service、Controller
@Controller
public class UserController {
@Autowired
private UserService userService; public void getStudentInfo(){
userService.getStudentInfo();
}
}
@Service
public class UserService {
@Autowired
private UserDao userDao; public void getStudentInfo() {
userDao.getStudentInfo();
}
}
@Repository
public class UserDao {
public void getStudentInfo() {
System.out.println("enenenenen"); }
}
@Test
public void test(){
UserController bean = ioc.getBean(UserController.class);
bean.getStudentInfo();
}
实验9:使用context:exclude-filter指定扫描包时不包含的类
<context:component-scan base-package="com.neuedu">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<context:component-scan base-package="com.neuedu" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<context:component-scan base-package="com.neuedu">
<context:exclude-filter type="aspectj" expression="com.neuedu.spring.entity.UserController"/>
</context:component-scan>
实验10:使用@Autowired注解实现根据类型实现自动装配
@Controller
public class UserController {
@Autowired
private UserService service; public void say(){
service.getStudentInfo();
}
}
@Service(value="service")
public class UserService {
@Autowired
private UserDao userDao; public void getStudentInfo() {
userDao.getStudentInfo();
}
}
@Controller
public class UserController {
@Autowired(required=false)
@Qualifier(value="BService")
private UserService ser; public void say(){
ser.getStudentInfo();
}
}
Spring(二)--FactoryBean、bean的后置处理器、数据库连接池、引用外部文件、使用注解配置bean等的更多相关文章
- Spring的Bean的生命周期以及Bean的后置处理器
Bean的生命周期: Spring IOC 容器可以管理 Bean 的生命周期, Spring 允许在 Bean 生命周期的特定点执行定制的任务. Spring IOC 容器对 Bean 的生命周期进 ...
- Spring中Bean的后置处理器
以下内容引用自http://wiki.jikexueyuan.com/project/spring/bean-post-processors.html: Bean后置处理器 BeanPostProce ...
- Spring源码之BeanFactoryPostProcessor(后置处理器)
Spring源码之BeanFactoryPostProcessor(后置处理器). 有点水平的Spring开发人员想必都知道BeanFactoryPostProcessor也就是常说的后置管理器,这是 ...
- BeanPostProcessor bean 的后置处理器
一. 自定 bean 的后置处理器 MyBeanPostProcessor 类.当你在初始化容器中的 bean 之前和之后,都会调用该处理器中的方法 @Component //将该后后置处理器加入到容 ...
- Spring Bean前置后置处理器的使用
Spirng中BeanPostProcessor和InstantiationAwareBeanPostProcessorAdapter两个接口都可以实现对bean前置后置处理的效果,那这次先讲解一下B ...
- [原创]java WEB学习笔记101:Spring学习---Spring Bean配置:IOC容器中bean的声明周期,Bean 后置处理器
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- spring中Bean后置处理器实现总结
BeanPostProcessor接口 bean的后置处理器实现功能主要是 可以在bean初始化之前和之后做增强处理.自定义MyBeanProcessor实现BeanPostProcessor接口,重 ...
- Spring Bean后置处理器
本例子源于:W3CSchool,在此作记录 Bean 后置处理器允许在调用初始化方法前后对 Bean 进行额外的处理. BeanPostProcessor 接口定义回调方法,你可以实现该方法来提供自己 ...
- Spring Bean的生命周期、后置处理器、定义继承
目录: 了解Spring的基本概念 Spring简单的示例 Spring Bean的定义及作用域 1.Bean的生命周期 Bean的生命周期可以简单的理解为:Bean的定义——Bean的初始化——Be ...
随机推荐
- Tomcat启动中的一些问题
(a)在eclipse中启动tomcat,在控制台加载的配置却是其他项目的,有时候也不是自己工作空间里的? 出现的一个原因是:在我tomcat的webapp目录下,我放了一个其他项目的war包,在to ...
- 函数响应式编程及ReactiveObjC学习笔记 (二)
之前我们初步认识了RAC的设计思路跟实现方式, 现在我们再来看看如果使用它以及它能帮我们做什么 One of the major advantages of RAC is that it provid ...
- C3制作导航栏分割线及立体风格
//首先写一个导航栏样式 .nav{ width:560px; height: 50px; font:bold 0/50px Arial; text-align:center; ...
- DirectX 11---从空间变换来看3D场景如何转化到2D屏幕
DirectX 11---从空间变换来看3D场景如何转化到2D屏幕 在看<Introduction to 3D Game Programming with DirectX 11>的时候,发 ...
- (转)目前比较全的CSS重设(reset)方法总结
在当今网页设计/开发实践中,使用CSS来为语义化的(X)HTML标记添加样式风格是重要的关键.在设计师们的梦想中都存在着这样的一个完美世界:所有的浏览器都能够理解和适用多有CSS规则,并且呈现相同的视 ...
- .NET Core 成都线下面基会拉开序幕
2017年07月29日下午,由 .NET China Foundation 成都小组组织的 .NET Core 成都地区线下技术交流会在成都成华区某茶楼成功举行,这也是成都地区 .NET Core 非 ...
- Java 程序员技能导图 1.0
做Java开发已经一年,并非科班出身,在毕业工作三年后毅然决然辞职,参加培训机构从零开始.在这期间迷茫.失望.绝望时常伴我左右,但是在不断自我提高与努力中渐渐看到一些小小的成果使我不断坚信自己的选择并 ...
- Spring事务管理的另一种方式--TransactionTemplate编程式事务管理简单入门
1, 一直以来, 在用Spring进行事物管理时, 只知道用声明式的策略, 即根据不同的数据源, 配置一个事物管理器(TransactionManager), 通过配置切面(PointCut)应用到相 ...
- python-希尔排序
希尔排序 希尔排序的实质就是分组插入排序,该方法又称缩小增量排序,因DL.Shell于1959年提出而得名. 希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本.希尔排序是非稳定排序算法 ...
- 使用CHCA搭建静态博客
[toc] chca是一个使用golang开发的静态博客生成器,简单.方便.快捷,抛弃每次都需要使用命令编译文件,采用文件监听方式编译,作者只需把markdown文件放到配置中的markdown文件夹 ...