在web項目中引入spring框架中的配置文件,我們給每一個java bean進行相關配置可以非常安全,便捷的管理我們的bean。那么,問題來了,如果一個項目中所涉及到的java bean十分龐大,而且每一個bean中的配置都是大同小異的,那么這份applicationContext.xml文件恐怕是無能為力了。接下來,我們使用spring的注解便可以很好的解決這一問題。
首先:我們瀏覽一下我們原始的applicationContext.xml中的部分配置
~~~
<bean id="myNewsAction" class="news.action.NewsAction" scope="prototype">
<property name="ns" ref="myNewsService"></property>
</bean>
<bean id="myNewsService" class="news.service.NewsServiceImpl" scope="prototype">
<property name="nd" ref="myNewsDao"></property>
</bean>
<bean id="myNewsDao" class="news.dao.NewsDaoImpl" scope="prototype">
<property name="sf" ref="mySessionFactory"></property>
</bean>
~~~
解析:在這個代碼段中我們可以看出,我們的控制器也就是我們的action訪問的是我們的service層,而service層則是訪問的數據層dao。在這種傳統的寫法中每個類有什么屬性要注入非常明顯,而今天我們要做的就是要簡化這份配置文件。
接下來:如果我們把這份配置文件簡化成這樣
~~~
<bean id="myNewsAction" class="news.action.NewsAction" scope="prototype"></bean>
<bean id="myNewsService" class="news.service.NewsServiceImpl" scope="prototype"></bean>
<bean id="myNewsDao" class="news.dao.NewsDaoImpl" scope="prototype"></bean>
~~~
解析:我們只是綁定了每個bean,但是并沒有為其注入屬性。其實我們是用到了spring的@Autowired,@Qualifier這兩個注解
~~~
@Autowired
@Qualifier("mySessionFactory")
private SessionFactory sf;
~~~
解析:在@Qualifier這個注解中我們申明其引用的是哪一個bean,spring便會自動為其注入這個實例,并且屬性的set方法也可省略
但是:經過上面的一番操作仿佛沒有給我省多少事,別急,認真看完本篇博客的人才知道有用的東西在最后。哈哈哈!
~~~
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd">
<!-- 基于news這個包自動掃描其中的類 ,也會自動注入解析器-->
<context:component-scan base-package="news"></context:component-scan>
<!-- 引入外部屬性文件 -->
<context:property-placeholder location="classpath:jdbc.properties" />
<bean id="mySessionFactory"
class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
</bean>
<bean id="myDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
</bean>
</beans>
~~~
解析:從這份applicationContext.xml文件中我們可以明顯的看到我們壓根沒有給我們的java bean進行相關配置,只是配置了一些基本的數據源。唯一多了一行
`<context:component-scan base-package="news"></context:component-scan>`通過這個節點的base-package屬性可以配置spring需要自動注入的哪個基包。
此時便是spring的@Controller @Service @Repository這三個注解起作用的時候了
~~~
@Controller("myNewsAction")
@Scope("prototype")
public class NewsAction extends ActionSupport {
@Autowired
@Qualifier("myNewsService")
private NewsService ns;
~~~
~~~
@Service("myNewsService")
@Scope("prototype")
public class NewsServiceImpl implements NewsService {
@Autowired
@Qualifier("myNewsDao")
private NewsDao nd;
~~~
~~~
@Repository("myNewsDao")
@Scope("prototype")
public class NewsDaoImpl implements NewsDao {
@Autowired
@Qualifier("mySessionFactory")
private SessionFactory sf;
~~~
解析:①,注解@Controller為我們的控制器action類的類注解相當于applicationContext.xml文件中的bean節點,而括號中的值相當于bean節點中的id屬性的屬性值。同理:@Service為我們業務層的類注解,@Repository為數據層dao的類注解。
②,注解 @Scope("prototype") 相當于applicationContext.xml文件中bean節點中scope屬性,這個非單例模式注解十分重要,主要起到線程安全,防止并發操作時出現異常的作用
小結:使用spring的類注解和屬性注解確實能給我們帶來許多便利,關于類屬性的注解其實jdk javax.annotation.Resource包中便有@Resource注解。所以,我們當然也可以選擇使用jdk的注解,不過要注意的是,千萬不要把jdk的注解和spring的注解混用。在軟件系統中,由于原生的jdk難免存在一些缺陷,我們在開發過程中往往需要引入各種框架,因此我們的項目便不得不與這些框架耦合在一起。雖然我們一直不希望我們的代碼出現耦合,畢竟這只是一種理想狀態。總之,輕度耦合一直是我們追求的代碼風格。
- 基礎
- 編譯和安裝
- scanner類(鍵盤錄入)
- Random類(隨機數)
- 數組
- 方法
- 類
- ArrayList集合
- char與int
- eclipse
- IDEA
- 變量與常量
- 常用API
- String,StringBuffer,StringBuilder
- 正則,Date,DateFormat,Calendar
- 包裝類,System,Math,Arrays,BigInteger,BigDecimal
- 集合,迭代器,增強for,泛型
- List,set,判斷集合唯一
- map,Entry,HashMap,Collections
- 異常
- IO
- File
- 遞歸
- 字節流
- 字符流
- IO流分類
- 轉換流
- 緩沖流
- 流的操作規律
- properties
- 序列化流與反序列化流
- 打印流
- commons-IO
- IO流總結
- 多線程
- 線程池
- 線程安全
- 線程同步
- 死鎖
- lock接口
- ThreadLoad
- 等待喚醒機制
- 線程狀態
- jdbc
- DBUtils
- 連接池DBCP
- c3p0連接池
- 網絡編程
- 多線程socket上傳圖片
- 反射
- xml
- 設計模式
- 裝飾器模式
- web service
- tomcat
- Servlet
- response
- request
- session和cookie
- JSP
- EL
- JSTL
- 事務
- 監聽器Listener
- 過濾器Filter
- json
- linux安裝軟件
- 反射詳解
- 類加載器和注解
- 動態代理
- jedis
- Hibernate
- 簡介
- 創建映射文件
- Hibernate核心配置文件
- 事務和增刪改查
- HibernateUtils
- 持久化對象的三種狀態
- 檢索方式
- query
- Criteria
- SQLQuery
- 持久化類
- 主鍵生成策略
- 緩存
- 事務管理
- 關系映射
- 注解
- 優化
- struts2
- 搭建
- 配置詳解
- Action
- 結果跳轉方式
- 訪問ServletAPI方式
- 如何獲得參數
- OGNL表達式
- valueStack 值棧
- Interceptor攔截器
- spring
- 導包
- IOC和DI
- Bean獲取與實例化
- Bean屬性注入
- spring注解
- 注解分層
- junit整合
- aop
- 動態代理實現
- cglib代理實現
- aop名詞
- spring的aop
- aop-xml詳解
- aop-注解詳解
- 代理方式選擇
- jdbcTemplate
- spring事務管理
- 回滾注意
- 事務傳播屬性
- MyBatis
- MyBatis簡介
- 入門程序
- 與jdbc hibernate不同
- 原始Dao開發
- Mapper動態代理方式
- SqlMapConfig.xml配置文件
- 輸入參數pojo包裝類
- resultMap
- 動態sql
- 一對一關聯
- 一對多
- 整合spring
- 逆向工程
- maven
- maven簡介
- 倉庫
- maven目錄結構
- maven常用命令
- 生命周期
- eclipse中maven插件
- 入門程序
- 整合struct
- 依賴范圍
- 添加插件
- idea配置
- jar包沖突
- 分模塊開發
- 構建可執行的jar包(包含依賴jar包)
- springMVC
- 處理流程
- java面試
- java版本升級
- java1-8版本變更
- java9新特性
- 鎖
- java資料
- idea
- jdk版本切換
- log4j
- 入門實例
- 基本使用方法
- Web中使用Log4j
- spring中使用log4j
- java代碼優化