简介
Spring的IOC功能,就是对象的实例化工作,由Spring容器完成.
Bean对象注意点
- 需要无参构造器;
- 默认情况下,生成的实例为单例;
- 在配置文件中的
<Bean>
,其实就是实例. - -
Spring容器注入Bean对象.
1.最常用的方式.
- 对象是类创建出来的
<bean id="employeeDAO" class="dao.impl.EmployeeDAOImpl"/>
2.静态工厂方法
- User对象是由工厂的方法creatUser()创建出来的:User user=工厂.creatUser();
- creatUser()方法中,是return new User();且是静态方法
<bean id="user" class="工厂全限名" factory-method="creatUser" />
3.实例工厂方法
- User对象是由工厂的对象的方法creatUser()创建出来的:User user=工厂对象.creatUser();
-
- creatUser()方法中,是return new User();且是实例方法
<bean id="工厂" class="工厂全限名">
<bean id="user" class="User全限名" factory-bean="工厂Bean的id" factory-method="creatUser" />
4.实现Spring的接口FactoryBean<T>
在声明Hibernate的SessionFactory的Bean时候,使用的类是LocalSessionFactoryBean,而不是Hibernate的的本身的工厂类
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"></bean>
LocalSessionFactoryBean的实质内容(简写)
public class LocalSessionFactoryBean implements FactoryBean<SessionFactory>{
//实现方法 返回sessionFactory对象
public SessionFactory getObject() {
return Configuration对象.buildSessionFactory(); //Hibernate框架就是这样子获取session工厂对象的.
}
//实现方法 返回sessionFactory.class
public Class<?> getObjectType() {
return SessionFactory.class;
}
}
在Spring加载Bean的代码
//判断生成的bean对象是否继承FactoryBean
if(oldBean instanof FactoryBean){
FactoryBean factory=(FactoryBean)Bean;//强转类型
Object newBean=factory.getObject(); //获取bean
}
好处:在LocalSessionFactoryBean 中重新加强的SessionFactory在Spring中的功能,可以有很多属性可以在Spring的配置文件中配置
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<!-- 注入连接池 -->
<property name="dataSource" ref="dataSource"/>
<!-- Hibernate的配置信息 -->
<property name="hibernateProperties">
<value>
hibernate.hbm2ddl.auto=update
hibernate.show_sql=true
hibernate.dialect=org.hibernate.dialect.MySQLDialect
hibernate.cache.use_second_level_cache=true
</value>
</property>
<!-- Hibernate的映射文件地址 -->
<property name="mappingDirectoryLocations">
<list>
<value>classpath:domain</value>
</list>
</property>
</bean>
Spring容器注入Bean对象的注解.
不可用于静态工厂,实例工厂.FactoryBean接口的方式
注解:(作用相同,将标签下的类,存入Spring容器)
- @Component ——工具类,如AOP的通知类
- @Service———– 服务类
- @Repository——- dao类
- @Controller——– Action类
<!--声明使用该注解,及扫描位置-->
<context:component-scan base-package="dao.impl"/>
@Repository("user") //注入进容器,且id=user
@Scope("propertype") //声明作用域(Action类才会用)
public class User{
@PostConstruct //初始化方法
public void init() {
System.out.println("初始化");
}
@PreDestroy //销毁方法
public void destroy() {
System.out.println("初始化");
}
}