Spring ioc詳解,IOC控制反轉對象bean

Spring ioc詳解

IOC:控制反轉-對象<bean>

1      程序對象由原來本身程序自己創建,變爲spring容器來創建。現在程序只能被動接受。什麼時候創建的bean對象。當讀取核心配置文件的時候,就創建了該對象!對象的生命週期完全由spring掌控!

2      使程序員只關注業務處理,而不需要關注對象的創建!

3      Ioc能夠實現程序的解耦!降低程序的耦合度!

public interface UserDao {

    void getUser();

}

public class UserMysqlDaoImpl implements UserDao {

 

    @Override

    public void getUser() {

        System.out.println("Mysql 數據庫獲取的數據!");

    }

 

}

public class UserOracleDaoImpl implements UserDao {

 

    @Override

    public void getUser() {

        System.out.println("oarcle 數據庫獲取的數據!");

    }

 

}

public interface UserService {

    void getUser();

}

 

public class UserServiceImpl implements UserService{

    //  關鍵

    private UserDao userDao;

   

    public UserDao getUserDao() {

       return userDao;

    }

 

    public void setUserDao(UserDao userDao) {

       this.userDao = userDao;

    }

 

    @Override

    public void getUser() {

       //  關鍵是:什麼時候給對象!此時該對象管理就交給我們的spring容器來管理!

       userDao.getUser();

    }

 

}

Beans.xml

<!-- Ioc:控制反轉,之前創建對象是由程序本身創建,現在對象是由spring容器來創建了。程序被動接受創建對象! -->

    <!-- value :是給的具體指!ref:指的是給對象的引用! -->

    <bean id="oracle" class="com.bjsxt.dao.impl.UserOracleDaoImpl"></bean>

    <bean id="mysql" class="com.bjsxt.dao.impl.UserMysqlDaoImpl"></bean>

   

    <!-- ref="oarcle" 相當於 userDao = new  UserOracleDaoImpl();-->

    <bean id="userServiceImpl" class="com.bjsxt.service.impl.UserServiceImpl" >

        <property name="userDao" ref="mysql"></property>

    </bean>

測試:

        ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");

        UserServiceImpl userServiceImpl = ac.getBean("userServiceImpl", UserServiceImpl.class);

        userServiceImpl.getUser();

注意:

<bean id="userServiceImpl" class="com.bjsxt.service.impl.UserServiceImpl" >

         <!-- userDao 具體指的是誰?UserServiceImpl類中的屬性?是setter方法名,去了set字母。

              由此得出結論:spring 依賴注意可以通過setter注入。

         -->

         <property name="userDao1" ref="mysql"></property>

     </bean>

Bean的生成方式

1.1     無參構造生成

public class Hello {

         public Hello() {

         }

         @Override

         public String toString() {

                   return "我是無參構造!";

         }

}

Beans.xml

<bean id="hello" class="com.bjsxt.pojo.Hello"></bean>

測試類:

ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");

Hello hello = ac.getBean("hello", Hello.class);

        System.out.println(hello);


1.2     有參構造

1.2.1  Type:通過數據類型注入:但是,在實際開發過程中不推薦使用。

public class Student {

         private int id;

         private String name;

}

 

<bean id="student" class="com.bjsxt.pojo.Student">

         <constructor-arg type="int" value="12"/>

         <constructor-arg type="String" value="高總"/>

</bean>

測試:

                   Student student = ac.getBean("student", Student.class);

                   System.out.println(student);

1.2.2  Index:通過下標來創建。

<!-- 有參構造 -->

<bean id="student" class="com.bjsxt.pojo.Student">

       <!-- index 代表第幾個屬性,小標從0開始 -->

       <constructor-arg index="0" value="12"/>

       <constructor-arg index="1" value="張惠妹"/>

</bean>

1.2.3  Name:spring2.x版本應該不支持name創建實體類

<bean id="student" class="com.bjsxt.pojo.Student">

         <!-- name:指的就是屬性名 -->

         <constructor-arg name="id" value="111"/>

         <constructor-arg name="name" value="趙本山"/>

</bean>

1.2.4  靜態工廠

public class StudentStaticFactory {

         public static Student getStudent(int id,String name){

                   return new Student(id, name);

         }

}

<!-- 靜態工廠  factory-method:指的是工廠中創建實體類的方法-->

<bean id="student" class="com.bjsxt.pojo.StudentStaticFactory" factory-method="getStudent">

         <constructor-arg index="0" value="1"/>

         <constructor-arg index="1" value="董卿"/>

</bean>

1.2.5  動態工廠

public class StudentDynamicFactory {

         public Student getStudent(int id,String name){

                   return new Student(id, name);

         }

}

<bean id="dynamic" class="com.bjsxt.pojo.StudentDynamicFactory"/>

<!-- 動態工廠:factory-bean:指的是動態工廠的bean:id -->

<bean id="student" class="com.bjsxt.pojo.Student" factory-bean="dynamic">

         <constructor-arg index="0" value="2"/>

         <constructor-arg index="1" value="黃渤"/>

</bean>

Scope屬性

1      Singleton 單例:<bean>標籤默認的就是單例

2      prototype原型:多例模式,每次創建的時候,則會實例化一個 新的對象

3      request 每次請求時創建一個新的對象

4      session 在會話的範圍內時一個對象

5      global session 只在portlet下有用,表示是application

6      application 在應用範圍中一個對象

         User user = ac.getBean("user",User.class);

                   System.out.println(user);

                   User user1 = ac.getBean("user",User.class);

                   System.out.println(user1);

                   System.out.println("8888888888888888888888");

                   System.out.println(user==user1);

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