1. 程式人生 > 實用技巧 >spring學習(二)配置bean

spring學習(二)配置bean

Spring可以分為6大模組:

  • Spring Core spring的核心功能: IOC容器, 解決物件建立及依賴關係

  • Spring Web Spring對web模組的支援。

    • 可以與struts整合,讓struts的action建立交給spring

    • spring mvc模式

  • Spring DAO Spring 對jdbc操作的支援 【JdbcTemplate模板工具類】

  • Spring ORM spring對orm的支援:

    • 既可以與hibernate整合,【session】

    • 也可以使用spring的對hibernate操作的封裝

  • Spring AOP 切面程式設計

  • SpringEE spring 對javaEE其他模組的支援

Spring Core 配置bean

引入jar包,涉及到Spring core的開發jar包有五個

  • commons-logging-1.1.3.jar 日誌

  • spring-beans-3.2.5.RELEASE.jar bean節點

  • spring-context-3.2.5.RELEASE.jar spring上下文節點

  • spring-core-3.2.5.RELEASE.jar spring核心功能

  • spring-expression-3.2.5.RELEASE.jar spring表示式相關表

Spring核心的配置檔案applicationContext.xml或者叫bean.xml通過ClassPathXmlApplicationContext來獲取ApplicationContext(IOC容器)

在Spring中可以通過三種方式來配置物件:

  • 使用XML檔案配置

  • 使用註解來配置

  • 使用JavaConfig來配置

使用Xml配置bean

  • 普通帶引數的構造方法

  <bean id="user" class="bean.User">
<!--
通過constructor這個節點來指定建構函式的引數型別、名稱、第幾個(index)
如果建構函式的引數值是一個物件,而不是一個普通型別的值,我們就需要用到ref屬性了,而不是value
-->
<constructor-arg name="id" type="java.lang.String" value="1"/>
<constructor-arg name="username" type="java.lang.String" value="tom"/>
</bean>
  • 工廠靜態方法

  <!--工廠靜態方法建立物件,直接使用class指向靜態類,指定靜態方法就行了-->
<bean id="user" class="bean.Factory" factory-method="getBean"/>
  • 工廠非靜態方法:先建立工廠bean,用工廠bean呼叫非靜態方法

<bean id="factory" class="bean.Factory"/>
<bean id="user" class="bean.User" factory-bean="factory" factory-method="getBean"/>
  • 構造方法傳入集合

使用註解配置bean

通過註解來配置資訊就是為了簡化IOC容器的配置,註解可以把物件新增到IOC容器中、處理物件依賴關係

使用註解前提步驟:

  • xml配置檔案先引入context名稱空間

  • 開啟註解掃描器

    • 第一種方法:在xml新增

    <context:component-scan base-package="包名"></context:component-scan>
    • 第二種方法:通過自定義掃描類以@CompoentScan修飾來掃描IOC容器的bean物件。在使用@ComponentScan()這個註解的時候,在測試類上需要@ContextConfiguration這個註解來載入配置類,@ContextConfiguration這個註解在Spring的test包下

    //表明該類是配置類
    @Configuration
    //啟動掃描器,掃描bb包下的類,也可以指定多個基礎包,也可以指定型別
    @ComponentScan("bb")
    public class AnnotationScan {
    }

建立物件以及處理物件依賴關係,相關的註解:

  • @ComponentScan掃描器

  • @Configuration表明該類是配置類

  • @Component 指定把一個物件加入IOC容器,把普通pojo例項化到spring容器中,相當於配置檔案中的<bean id="" class=""/>

  • @Repository 作用同@Component; 在DAO層使用

  • @Service 作用同@Component; 在業務邏輯層使用

  • @Controller 作用同@Component; 在控制層使用

  • @Resource 依賴關係

    • 如果@Resource不指定值name,那麼就根據型別來找,相同的型別在IOC容器中不能有兩個

    • 如果@Resource指定了值,那麼就根據名字來找

測試程式碼

//把物件新增到容器中,首字母會小寫
@Repository
public class UserDao {
public void save(){
System.out.println("db:儲存使用者");
}
}

//把UserService物件新增到IOC容器中,首字母會小寫
@Service
public class UserService {
//如果@Resource不指定值,那麼就根據型別來找,如果指定了值,那麼Spring就在IOC容器找id為userDao的物件
@Resource
private UserDao userDao;
public void save(){
userDao.save();
}
}

//把物件新增到IOC容器中,首字母會小寫
@Controller
public class UserAction {
@Resource
private UserService userService;
public String execute(){
userService.save();
return null;
}
}

public class demo1 {
public static void main(String[] args) {
ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
UserAction userAction=(UserAction)ac.getBean("userAction");
userAction.execute();
}
}

使用JavaConfig配置bean

由於Spring的自動裝配並不能將第三方庫元件裝配到應用中,於是需要顯式裝配配置

通過java程式碼來配置Bean:

  • 編寫一個java類,使用@Configuration修飾該類,被@Configuration修飾的類就是配置類

  • 在配置類中使用@Bean修飾方法,蔣返回值加入到IOC容器中

    • 使用@Bean來修飾方法,該方法返回一個物件。

    • 不管方法體內的物件是怎麼建立的,Spring可以獲取得到物件就行了。

    • Spring內部會將該物件加入到IOC容器中

    • 容器中bean的ID預設為方法名

  • 在測試類使用@ContextConfiguration載入配置類的資訊

@Configuration
public class BeanConfiguration {
@Bean
public User user(){
User user=new User();
System.out.println("我是在configuration中的"+user);
return user;
}
}

@ContextConfiguration
public class demo1 {
public static void main(String[] args) {
ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
User user=(User)ac.getBean("user");
System.out.println(user);
}
}

三種方式混合使用

註解和XML配置是可以混合使用的,JavaConfig和XML也是可以混合使用的…

如果JavaConfig的配置類是分散的,我們一般再建立一個更高階的配置類(root),然後使用@Import來將配置類進行組合 如果XML的配置檔案是分散的,我們也是建立一個更高階的配置檔案(root),然後將配置檔案組合

在JavaConfig引用XML

  • 使用@ImportResource()

在XML引用JavaConfig

  • 使用<bean>節點就行了

<bean>節點的屬性

scope屬性

scope的值就只有兩個:單例、多例spring預設是單例

  • 當我們使用singleton【單例】的時候,從IOC容器獲取的物件都是同一個,預設是單例 【service/dao/工具類】

    • 當使用singleton的時候,物件在IOC容器初始化時建立

  • 當我們使用prototype【多例】的時候,從IOC容器獲取的物件都是不同的,【Action物件】

    • 當使用prototype的時候,物件在使用的時候才建立

lazy-init屬性

lazy-init屬性只對singleton【單例】的物件有效,lazy-init預設為false

有的時候,可能我們**想要物件在使用的時候才建立,那麼將lazy-init設定為ture

init-method和destroy-method

如果我們想要物件在建立後,執行某個方法,我們指定為init-method屬性,對應物件的init_user方法

如果我們想要IOC容器銷燬後,執行某個方法,我們指定destroy-method屬性,在呼叫容器物件的destroy方法時候執行(容器用實現類)