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); |