一、Java Beam及工厂模式
1、工厂模式
方式一:构造方法实例化bean
1
| <bean id="bookDao”class="com.itheima.dao.impl.BookDaoImpl"/>
|
方式二:使用静态工厂实例化bean
1
| <bean id="orderDao"class="com. itheima.factory.0rderDaoFactory" factory-method="getOrderDao"/>
|
方式三: 使用实例工厂实例化bean
1 2
| <bean id="userFactory”class="com,itheima.factory.UserDaoFactory"/> <bean id="userDao" factory-method="getUserDao" factory-bean="userFactory"/>
|
方法四:FactoryBeam
1
| <bean id="userDao" class="com.itheima.factory.UserDaoFactoryBean"/>
|
UserDaoFactoryBeam.java
1 2 3 4 5 6 7 8 9 10 11 12 13
| public class UserDaoFactoryBean implements FactoryBean<UserDao> {
public UserDao getObject() throws Exception { return new UserDaoImpl(); } public Class<?> getobjectType(){ return UserDao.class; } public boolean isSingleton() { return true; } }
|
2.Beam生命周期
(1)
1 2 3
|
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl" init-method="init" destroy-method="destory"/>
|
(2)设置自动关闭
1
| a.registerShutdownHook();
|
(3)一般不写,在Tomcat后关闭

3.依赖注入
1.Setter注入——简单类型
(1)在bean中定义引用类型属性并提供可访问的set方法
1 2 3 4 5 6
| public class BookDaoImpl implements BookDao { private int connectionNumber; public void setConnectionNumber(int connectionNumber) { this.connectionNumber = connectionNumber; } }
|
(2)配置中使用property标签value属性注入简单类型数据
1 2 3
| <bean id="bookDao" class="com,itheima.dao.impl.BookDaoImpl"> <property name="connectionNumber” value="10"/> </bean>
|
2.构造器注入
在bean中定义引用类型属性并提供可访问的构造方法
1 2 3 4 5
| public class BookServiceImpl implements BookServicef private BookDao bookDao; public BookServiceImp1(BookDao bookDao) { this.bookDao = bookDao; }
|
配置中使用constructor-arg标签ref属性注入引用类型对象
1 2 3 4
| <bean id="bookService”class="com,itheima,service,impl.BookServiceImpl"> <constructor-arg name="bookDao”ref="bookDao"/> </bean> <bean id="bookDao”class="com.itheima.dao.impl.BookDaoImpl"/>
|
配置中使用constructor-arg标签type属性设置按形参类型注入
1 2 3 4
| <bean id="bookDao”class="com.itheima.dao.impl.BookDaoImpl"> <constructor-arg type="int" value="10"/> <constructor-arg type="java.lang.String” value="mysql"/> </bean>
|
配置中使用constructor-arg标签index属性设置按形参位置注入
1 2 3 4
| <bean id="bookDao” class="com.itheima.dao.impl.BookDaoImpl"> <constructor-arg index="” value="10"/> <constructor-arg index="1” value="mysql"/> </bean>
|
依赖注入方式选择
- 强制依赖使用构造器进行,使用setter注入有概率不进行注入导致nu11对象出现
- 可选依赖使用setter注入进行,灵活性强
- Spring框架倡导使用构造器,第三方框架内部大多数采用构造器注入的形式进行数据初始化,相对严谨
- 如果有必要可以两者同时使用,使用构造器注入完成强制依赖的注入,使用setter注入完成可选依赖的注入
- 实际开发过程中还要根据实际情况分析,如果受控对象没有提供setter方法就必须使用构造器注入
- 自己开发的模块推荐使用setter注入

3.自动装配
IoC容器根据bean所依赖的资源在容器中自动查找并注入到bean中的过程称为自动装配
自动装配方式:按类型( 常用 )、按名称、按构造方法、不启用自动装配
1
| <bean id="bookServiceclass="com.itheima,service.impl.BookServiceImpl" autowire="byType"/>
|
依赖自动装配特征
- 自动装配用于引用类型依赖注入,不能对简单类型进行操作
- 使用按类型装配时( byType )必须保障容器中相同类型的bean唯一,推荐使用
- 使用按名称装配时( byName )必须保障容器中具有指定名称的bean,因变量名与配置合,不推荐使用
- 自动装配优先级低于setter注入与构造器注入,同时出现时自动装配配置失效
注入集合:数组、List、Set、Map、Properties
Spring管理第三方资源案例
DruidDataSource
ComboPooledDataSource
1 2 3 4 5 6 7 8 9 10 11 12 13
| <bean id="dataSource" class="com.alibaba,druid.pool.DruidDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="ur1" value="jdbc:mysql://localhost:3306/spring db"/> <property name="username" value="root"/> <property name="password” value="root"/> </bean> <bean class="com.mchange.v2.c3pe.ComboPooledDataSource"> <property name="driverClass" value="com,mysql.jdbc.Driver"/> <property name="jdbcUr1" value="jdbc:mysql://localhost;3306/spring_db"/> <property name="user” value="root"/> <property name="password” value="root"/> </bean>
|
使用properties文件进行解耦管理
1.开启context而名空间
2.使用context空间加properties 文件
1
| <context:property-placeholder location="jdbc.properties"/>
|
3.使用属性占位行${}读取properties 文件中的属性
1 2 3 4 5 6 7 8 9 10
| <bean class="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="${jdbc.driver}"/> <property name="ur1” value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password” value="${jdbc.password}"/> </bean>
<bean id-"bookDao” class="com.itheima.dao.impl.BookDaoImpl". <property name="name” value="${jdbc.driver}"/> </bean>
|
容器
1.创建容器
ClassPathXmlApplicationContext
FileSystemXmlApplicationContext
1 2 3 4 5 6 7 8 9 10
| public class App { public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); ApplicationContext ctx = new FileSystemXmlApplicationContext configlocation: "D://aaa/applicationContext.xml"), BookDao bookDao = (BookDao) ctxgetBean( s:"bookDao"); bookDao.save(); } }
|
加载多个配置文件
1
| ApplicationContext ctx = new ClassPathXmlApplicationContext("bean1.xml", "bean2.xml");
|
2.获取bean (3种)
方式一: 使用bean名称获取
1
| BookDao bookDao = (BookDao) ctx.getBean("bookDao");
|
方式二:使用bean名称获取并指定类型
1
| BookDao bookDao = ctx.getBean("bookDao", BookDao.class);
|
方式三:使用bean类型获取
1
| BookDao bookDao = ctx.getBean(BookDao.class);
|
3.容器类层次结构

4.BeanFactory
类路径加载配置文件
1 2 3 4
| Resource resources = new ClassPathResource( "applicationContext,xml") BeanFactory bf = new XmlBeanFactory(resources) BookDao bookDao = bf.getBean("bookDao",BookDao.class) bookDao .save()
|
BeanFactory创建完毕后,所有的bean均为延迟加载
总结


注解开发定义bean
使用@Component定义bean
1 2 3 4 5 6
| @Component("bookDao") public class BookDaoImpl implements BookDao { } @Component public class BookServiceImpl implements BookService { }
|
核心配置文件中通过组件扫描加载bean
1
| <context:component-scan base-package="com.itheima"/>
|
纯注解开发