天天看點

【Spring】【IOC】【Spring容器注入Bean對象的四種方式】【Spring中注入bean對象的注解】

簡介

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的的本身的工廠類

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("初始化");
    }

}