springIOC簡述



1、spring概述
 spring是一個開源的設計層面框架,解決的是業務邏輯和其他各層的松耦合問題,
因爲他將面向接口的編程思想貫穿整個系統應用。Spring是於2003 年興起的一個輕量
級的Java 開發框架,由Rod Johnson創建。簡單來說,Spring是一個分層的JavaSE/EEfull-stack(一站式)輕量級開源框架。
 spring框架由很多模塊組成,IOC、AOP、spring MVC、spring事務等,
 當然spring也可以整合其他框架例如:mybatis、shiro等。
2、spring IOC
 在java程序中,一個業務邏輯的實現往往需要多個對象來協作完成。在程序中我們使
用new Object()的方式創建對象,並且還要維護對象之間的相互依賴創建。所謂IOC(Inve
rsion of Control,控制反轉),對於spring框架來說,就是由spring來負責控制對象的生
命週期以及對象之間的關係。對象的創建、銷燬,對象之間的相互依賴關係都由spring來完
成,對象只需要關心業務邏輯本身就可以了。控制反轉就是獲得依賴對象的方式反轉了。
2、1
 --需要的jar包
   --spring-core-4.3.5.RELEASE.jar
   --spring-beans-4.3.5.RELEASE.jar
   --spring-context-4.3.5.RELEASE.jar
   --spring-logging-4.3.5.RELEASE.jar
   --spring-expression-4.3.5.RELEASE.jar
2、2
 創建spring配置文件
  新建spring配置文件applicationContext.xml,該文件爲spring配置的默認名,也可以
 自己起名字。
  <?xml version="1.0" encoding="UTF-8"?>
  <beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-4.3.xsd">
  </beans>

2、3測試
  @Test
  public void testInitContext(){
   String conf = "applicationContext.xml";
   ApplicationContext applicationContext =
     new ClassPathXmlApplicationContext(conf);
   System.out.println(applicationContext);
  }
3 spring容器創建JavaBean

1、在applicationContext.xml中添加bean對象創建聲明
  <!-- 用構造器來實例化bean -->
  <bean id="userDao" class="com.ztd.springdemo.demo01.UserDao"></bean>
1.2、獲得bean
  @Test
  public void testInitContext(){
   //1.實例化spring容器
   String conf = "applicationContext.xml";
   ApplicationContext applicationContext =
     new ClassPathXmlApplicationContext(conf);
   //2.獲得容器創建的bean實例
   UserDao userDao =
     (UserDao)applicationContext.getBean("userDao");
   userDao.create();
  }
1.3、bean屬性注入
 1、以構造方法的方式注入屬性
  <bean id="user" class="com.ztd.springdemo.demo01.User">
   <constructor-arg name="account" value="admin"/>
   <constructor-arg name="username" value="管理員"/>
  </bean>
 注意:必須有這個構造方法纔行,參數名與構造方法中的保持一致
 2、以set方法的方式注入屬性
  <bean id="user" class="com.ztd.springdemo.demo01.User">
   <property name="account" value="admin"/>
   <property name="username" value="管理員"/>
  </bean>
  注意:必須要有無參構造器方法和對應的getter/setter方法
 3、對象類型的屬性的注入
  <bean id="userDao" class="com.ztd.springdemo.demo01.UserDao"
    init-method="init" destroy-method="destory" scope="singleton" />
  <bean id="userService" class="com.ztd.springdemo.demo01.UserService">
   <!-- ref屬性:引用另一個bean的id或name -->
   <property name="userDao" ref="userDao"></property>
  </bean>
1.3、bean標籤屬性介紹
 1、bean的創建模式
  scope屬性指定了bean的創建模式
   --singleton:單利的,默認的,只創建一個對象,調用getbean方法獲取到的
  是同一個對象
   --prototype多例的,每次調用getbean方法獲取的對象是從新創建的
  <bean id="userDao" class="com.ztd.springdemo.demo01.UserDao"
   scope="prototype"/>
 2、bean初始化和銷燬的回調方法
 
  init-method屬性指定的方法,在bean創建後自動調用
   <bean id="userDao" class="com.ztd.springdemo.demo01.UserDao"
    init-method="init"/>
    
  destory-method屬性指定的方法,在bean銷燬前自動調用
   <bean id="userDao" class="com.ztd.springdemo.demo01.UserDao"
    destroy-method="destroy"/>
 3、bean初始化時間
  lazy-init屬性指定了bean的創建時間
  false:spring容器創建時就創建該bean
  true:使用該bean時創建
   <bean id="userDao" class="com.ztd.springdemo.demo01.UserDao"
    lazy-init="true"/>
4 spring自動組件掃描
  一般在xml配置文件中,聲明一個bean或組件,spring容器會檢測和註冊該bean或組件。
 除了這種方式之外,spring還支持自動掃描bean或組件,這樣就不必再在xml文件中繁瑣的
 聲明bean或組件。
 4.1、在applicationContext.xml中指定掃描類的路徑
  <context:component-scan base-package="com.ztd.springdemo.demo02"/>
  如上註解會自動掃描com.ztd.springdemo.demo02包及其子包下所有組件類
 4.2、使用註解標註類
  指定了掃描路徑後並不是該路徑下所有類都會被spring容器實例化註冊,只是在類上加上
 指定的註解標記時spring容器纔會實例化註冊。
  @Component   通用註解
  @Repository  持久化層組件註解
  @Service  業務層組件註解
  @Controller  控制層組件註解
  以上註解目前功能是一樣,爲了讓標註類本身的用途看起來更清晰。
  
  import org.springframework.stereotype.Component;

   @Component
   public class UserDao {
    public void create(){
     System.out.println("創建了一個user");
    }
   }

  默認bean名字爲類名首字母小寫,如需自己指定bean的名字,使用如下方式
   @Component(“bean名字”)
   @Component("userDao")
   public class UserDaoImpl implements UserDao{
    public void create(){
     System.out.println("創建了一個user");
    }
   }

 4.2、bean屬性注入
  1、 @Value 用於注入普通類型的屬性
   
   @Value(“admain”)
   private String account;
  2、@Autowried 自動裝配,是spring的註解
   默認按照類型注入
   若按名子注入則需要加@Qualifier強制使用名字注入
   @Autowried
   @Qualifier("userDaoImpl")
   private UserDao;
  3、@Resource 是JavaEE的註解
   先按照名字注入,找不到,則按照類型
   如需指定名字@Resource(name="bean名字")
   @Resource(name="userDaoImpl")
   private UserDao userDao;
 4.3 指定bean的創建模式
  默認爲單利模式,如需多例@Scope(“prototype”)
  @Component
  @Scope("prototype")
  public class UserService {
  }
 4.4、指定bean初始化和銷燬的回調方法
  bean初始化後的方法@PostConstruct
  bean銷燬前執行的方法@PreDestroy
  @PostConstruct
  public void init(){
   System.out.println("userDao 創建");
  }

  @PreDestroy
  public void destroy(){
   System.out.println("userDao 銷毀");
  }

5、spring在web應用中的使用

 1、加入spring-web-*jar
 2、在web.xml中加入
 <context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>classpath:applicationContext.xml</param-value>
 </context-param>
 <listener>
  <listener-class>org.springframework.web,context.ContextLoaderlistener</listener-class>
 <listener>
 3、從servletContext中獲取spring容器實例
 ServletContext sc = getServletContext();
 ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(sc);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章