SPRING

 

到http://www.springsource.org/download下載spring,然後進行解壓縮,在解壓目錄中找到下面jar文件,拷貝到類路徑下
dist/spring.jar
lib/jakarta-commons/commons-logging.jar
如果使用了切面編程(AOP),還需要下列jar文件
lib/aspectj/aspectjweaver.jar和aspectjrt.jar
lib/cglib/cglib-nodep-2.1_3.jar
如果使用了JSR-250中的註解,如@Resource/@PostConstruct/@PreDestroy,還需要下列jar文
lib/j2ee/common-annotations.jar
 
 
 
由於springschema文件位於網絡上,如果機器不能連接到網絡,那麼在編寫配置信息時候就無法出現提示信息,解決方法有兩種:
1。讓機器上網,eclipse會自動從網絡上下載schema文件並緩存在硬盤上。
2。手動添加schema文件,方法如下:
windwos->preferences->myeclipse->files and editors->xml->xmlcatalog
"add",在出現的窗口中的Key Type中選擇URI,location中選"File system",然後在spring解壓目錄的dist/resources目錄中選擇spring-beans-2.5.xsd,回到設置窗口的時候不要急着關閉窗口,應把窗口中的Key Type改爲Schema location,Key改爲http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
 
 
 
實例化Spring容器常用的兩種方式:
方法一:
在類路徑下尋找配置文件來實例化容器
ApplicationContext ctx = new ClassPathXmlApplicationContext(new String[]{"beans.xml"});
方法二:
在文件系統路徑下尋找配置文件來實例化容器
ApplicationContext ctx = new FileSystemXmlApplicationContext(new String[]{“d://beans.xml“});
Spring的配置文件可以指定多個,可以通過String數組傳入。
 
 
 
spring容器啓動後,因爲spring容器可以管理bean對象的創建,銷燬等生命週期,所以我們只需從容器直接獲取Bean對象就行,而不用編寫一句代碼來創bean對象。從容器獲取bean對象的代碼如下:
ApplicationContext ctx = new ClassPathXmlApplicationContext(“beans.xml”);
OrderService service = (OrderService)ctx.getBean("personService");
 
 
 
1.使用類構造器實例化
<bean id=“orderService" class="cn.itcast.OrderServiceBean"/>
2.使用靜態工廠方法實例化
<bean id="personService" class="cn.itcast.service.OrderFactory" factory-method="createOrder"/>
public class OrderFactory {
public static OrderServiceBean createOrder(){
return new OrderServiceBean();
}
}
3.使用實例工廠方法實例化:
<bean id="personServiceFactory" class="cn.itcast.service.OrderFactory"/>
<bean id="personService" factory-bean="personServiceFactory" factory-method="createOrder"/>
public class OrderFactory {
public OrderServiceBean createOrder(){
return new OrderServiceBean();
}
}
 
 
 
 
基本類型對象注入:
<bean id="orderService" class="cn.itcast.service.OrderServiceBean">
<constructor-arg index=“0” type=“java.lang.String” value=“xxx”/>//構造器注入
<property name=“name” value=“zhao/>//屬性setter方法注入
</bean>
注入其他bean
方式一
<bean id="orderDao" class="cn.itcast.service.OrderDaoBean"/>
<bean id="orderService" class="cn.itcast.service.OrderServiceBean">
<property name="orderDao" ref="orderDao"/>
</bean>
方式二(使用內部bean,但該bean不能被其他bean使用)
<bean id="orderService" class="cn.itcast.service.OrderServiceBean">
<property name="orderDao">
<bean class="cn.itcast.service.OrderDaoBean"/>
</property>
</bean>
 
 
 
l使用構造器注入
l使用屬性setter方法注入
l使用Field注入(用於註解方式)
注入依賴對象可以採用手工裝配自動裝配,在實際應用中建議使用手工裝配,因爲自動裝配會產生未知情況,開發人員無法預見最終的裝配結果。
1.手工裝配依賴對象
2.自動裝配依賴對象
 
 
 
 
手工裝配依賴對象,在這種方式中又有兩種編程方式
1. xml配置文件中,通過在bean節點下配置,如
<bean id="orderService" class="cn.itcast.service.OrderServiceBean">
<constructor-arg index=“0” type=“java.lang.String” value=“xxx”/>//構造器注入
<property name=“name” value=“zhao/>//屬性setter方法注入
</bean>
2. java代碼中使用@Autowired@Resource註解方式進行裝配。但我們需要在xml配置文件中配置以下信息:
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd">
          <context:annotation-config/>
</beans>
這個配置隱式註冊了多個對註釋進行解析處理的處理器:AutowiredAnnotationBeanPostProcessorCommonAnnotationBeanPostProcessorPersistenceAnnotationBeanPostProcessorRequiredAnnotationBeanPostProcessor
      注: @Resource註解在spring安裝目錄的lib/j2ee/common-annotations.jar
 
 
 
 
java代碼中使用@Autowired@Resource註解方式進行裝配,這兩個註解的區別是:@Autowired 默認按類型裝配,@Resource默認按名稱裝配,當找不到與名稱匹配的bean纔會按類型裝配。
    @Autowired
    private PersonDao  personDao;//用於字段上
    @Autowired
    public void setOrderDao(OrderDao orderDao) {//用於屬性的setter方法上
        this.orderDao = orderDao;
    }
@Autowired註解是按類型裝配依賴對象,默認情況下它要求依賴對象必須存在,如果允許null值,可以設置它required屬性爲false如果我們想使用按名稱裝配,可以結合@Qualifier註解一起使用。如下:
    @Autowired  @Qualifier("personDaoBean")
    private PersonDao  personDao;
@Resource註解和@Autowired一樣,也可以標註在字段或屬性的setter方法上,但它默認按名稱裝配。名稱可以通過@Resourcename屬性指定,如果沒有指定name屬性,當註解標註在字段上,即默認取字段的名稱作爲bean名稱尋找依賴對象,當註解標註在屬性的setter方法上,即默認取屬性名作爲bean名稱尋找依賴對象。
    @Resource(name=personDaoBean)
    private PersonDao  personDao;//用於字段上
注意:如果沒有指定name屬性,並且按照默認的名稱找不到依賴對象時, @Resource註解會回退到按類型裝配。但一旦指定了name屬性,就只能按名稱裝配了。
 
 
 
前面的例子我們都是使用XMLbean定義來配置組件。在一個稍大的項目中,通常會有上百個組件,如果這些這組件採用xmlbean定義來配置,顯然會增加配置文件的體積,查找及維護起來也不太方便。spring2.5爲我們引入了組件自動掃描機制,他可以在類路徑底下尋找標註了@Component@Service@Controller@Repository註解的類,並把這些類納入進spring容器中管理。它的作用和在xml文件中使用bean節點配置組件是一樣的。要使用自動掃描機制,我們需要打開以下配置信息:
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd">
          <context:component-scan base-package="cn.itcast"/>
</beans>
其中base-package爲需要掃描的包(含子包)
@Service用於標註業務層組件、 @Controller用於標註控制層組件(如struts中的action)、@Repository用於標注數據訪問組件,即DAO組件。而@Component泛指組件,當組件不好歸類的時候,我們可以使用這個註解進行標註。
 
 
 
 
 
 
Aspect(切面):指橫切性關注點的抽象即爲切面,它與類相似,只是兩者的關注點不一樣,類是對物體特徵的抽象,而切面是橫切性關注點的抽象.
joinpoint(連接點):所謂連接點是指那些被攔截到的點。在spring中,這些點指的是方法,因爲spring只支持方法類型的連接點,實際上joinpoint還可以是field或類構造器)
Pointcut(切入點):所謂切入點是指我們要對那些joinpoint進行攔截的定義.
Advice(通知):所謂通知是指攔截到joinpoint之後所要做的事情就是通知.通知分爲前置通知,後置通知,異常通知,最終通知,環繞通知
Target(目標對象):代理的目標對象
Weave(織入):指將aspects應用到target對象並導致proxy對象創建的過程稱爲織入.
Introduction(引入):在不修改類代碼的前提下, Introduction可以在運行期爲類動態地添加一些方法或Field.
 
 
 
要進行AOP編程,首先我們要在spring的配置文件中引入aop命名空間:
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
</beans>
Spring提供了兩種切面使用方式,實際工作中我們可以選用其中一種:
l基於XML配置方式進行AOP開發。
l基於註解方式進行AOP開發。
 
 
 
首先啓動對@Aspect註解的支持(藍色部分):
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
 <aop:aspectj-autoproxy/>
<bean id="orderservice" class="cn.itcast.service.OrderServiceBean"/>
<bean id="log" class="cn.itcast.service.LogPrint"/>
</beans>
 
 
 
 
@Aspect
public class LogPrint {
@Pointcut("execution(* cn.itcast.service..*.*(..))")
private void anyMethod() {}//聲明一個切入點
@Before("anyMethod() && args(userName)")//定義前置通知
public void doAccessCheck(String userName) {
}
@AfterReturning(pointcut="anyMethod()",returning="revalue")//定義後置通知
public void doReturnCheck(String revalue) {
}
@AfterThrowing(pointcut="anyMethod()", throwing="ex")//定義例外通知
    public void doExceptionAction(Exception ex) {
}
@After("anyMethod()")//定義最終通知
public void doReleaseAction() {
}
@Around("anyMethod()")//環繞通知
public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {
return pjp.proceed();
}
}
 
 
 
 
public class LogPrint {
public void doAccessCheck() {}定義前置通知
public void doReturnCheck() {}定義後置通知
    public void doExceptionAction() {}定義例外通知
public void doReleaseAction() {}定義最終通知
public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {
return pjp.proceed();環繞通知
}
}
 
 
 
 
<bean id="orderservice" class="cn.itcast.service.OrderServiceBean"/>
<bean id="log" class="cn.itcast.service.LogPrint"/>
<aop:config>
  <aop:aspect id="myaop" ref="log">
  <aop:pointcut id="mycut" expression="execution(* cn.itcast.service..*.*(..))"/>
  <aop:before pointcut-ref="mycut" method="doAccessCheck"/>
  <aop:after-returning pointcut-ref="mycut" method="doReturnCheck "/>
  <aop:after-throwing pointcut-ref="mycut" method="doExceptionAction"/>
  <aop:after pointcut-ref="mycut" method=“doReleaseAction"/>
  <aop:around pointcut-ref="mycut" method="doBasicProfiling"/>
  </aop:aspect>
</aop:config>
 
 
 
使用Spring+JDBC集成步驟如下:
l配置數據源,如:
 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="org.gjt.mm.mysql.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/itcast?useUnicode=true&amp;characterEncoding=UTF-8"/>
    <property name="username" value="root"/>
    <property name="password" value="123456"/>
     .....略
  </bean>
    上面使用了Apache組織的dbcp數據源,我們需要把lib/jakarta-commons下的commons-dbcp.jar和commons-pool.jar加入類路徑下.
l配置事務。配置事務時,需要在xml配置文件中引入用於聲明事務的tx命名空間(見下頁),事務的配置方式有兩種:註解方式和基於XML配置方式。
 
 
 
 
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">
</beans>
 
 
 
 
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="org.gjt.mm.mysql.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/itcast?useUnicode=true&amp;characterEncoding=UTF-8"/>
    <property name="username" value="root"/>
    <property name="password" value="123456"/>
     <!-- 連接池啓動時的初始值 -->
 <property name="initialSize" value="1"/>
 <!-- 連接池的最大值 -->
 <property name="maxActive" value="500"/>
 <!-- 最大空閒值.當經過一個高峯時間後,連接池可以慢慢將已經用不到的連接慢慢釋放一部分,一直減少到maxIdle爲止 -->
 <property name="maxIdle" value="2"/>
 <!--  最小空閒值.當空閒的連接數少於閥值時,連接池就會預申請一些連接,以避免洪峯來時再申請而造成的性能開銷 -->
 <property name="minIdle" value="1"/>
  </bean>
 
 
 
 
使用<context:property-placeholder location=jdbc.properties/>屬性佔位符
<context:property-placeholder location=“jdbc.properties”/>
 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
   <property name="driverClassName" value="${driverClassName}"/>
    <property name="url" value="${url}"/>
    <property name="username" value="${username}"/>
    <property name="password" value="${password}"/>
 <property name="initialSize" value="${initialSize}"/>
 <property name="maxActive" value="${maxActive}"/>
 <property name="maxIdle" value="${maxIdle}"/>
 <property name="minIdle" value="${minIdle}"/>
  </bean>
 
 
 
 
l採用註解方式
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource" ref="dataSource"/>
  </bean>
 <! 採用@Transactional註解方式使用事務  -->
  <tx:annotation-driven transaction-manager="txManager"/>
@Service @Transactional
public class PersonServiceBean implements PersonService {
}
 
 
 
 
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource" ref="dataSource"/>
</bean>
<aop:config>
  <aop:pointcut id="transactionPointcut" expression="execution(* cn.itcast.service..*.*(..))"/>
  <aop:advisor advice-ref="txAdvice" pointcut-ref="transactionPointcut"/>
</aop:config>
<tx:advice id="txAdvice" transaction-manager="txManager">
  <tx:attributes>
    <tx:method name="get*" read-only="true" propagation="NOT_SUPPORTED"/>
    <tx:method name="*"/>
  </tx:attributes>
</tx:advice>
 
 
 
@Service @Transactional
public class PersonServiceBean implements PersonService {
private JdbcTemplate jdbcTemplate;
@Resource
public void setDataSource(DataSource dataSource) {
    this.jdbcTemplate = new JdbcTemplate(dataSource);
}
    //添加
public void save(Person person) throws Exception{
jdbcTemplate.update("insert into person (name) values(?)",
new Object[]{person.getName()}, new int[]{java.sql.Types.VARCHAR});
}
}
 
 
 
 
@Service @Transactional
public class PersonServiceBean implements PersonService {
private JdbcTemplate jdbcTemplate;
@Resource
public void setDataSource(DataSource dataSource) {
    this.jdbcTemplate = new JdbcTemplate(dataSource);
}
  public Person getPerson(Integer id){
RowMapper rowMapper = new RowMapper(){
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
Person person = new Person();
person.setId(rs.getInt("id"));
person.setName(rs.getString("name"));
return person;
}
};
return (Person)jdbcTemplate.queryForObject("select * from person where id=?",
new Object[]{id}, new int[]{java.sql.Types.INTEGER}, rowMapper);
 
 
 
@Service @Transactional
public class PersonServiceBean implements PersonService {
private JdbcTemplate jdbcTemplate;
@Resource
public void setDataSource(DataSource dataSource) {
    this.jdbcTemplate = new JdbcTemplate(dataSource);
}
public List<Person> getPersons(){
RowMapper rowMapper = new RowMapper(){
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
Person person = new Person();
person.setId(rs.getInt("id"));
person.setName(rs.getString("name"));
return person;
}
};
return jdbcTemplate.query("select * from person", rowMapper);
}
}
 
 
 
 
發佈了59 篇原創文章 · 獲贊 0 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章