spring入門(ioc)
spring簡介:
Spring是一個開源框架,它由Rod Johnson建立。它是為了解決企業應用開發的複雜性而建立的。
Spring使用基本的JavaBean來完成以前只可能由EJB完成的事情。Spring的用途不僅限於伺服器端的開發。從簡單性、可測試性和鬆耦合的角度而言,任何Java應用都可以從Spring中受益。簡單來說,Spring是一個輕量級的控制反轉(IoC)和麵向切面(AOP)的容器框架。
目的:解決企業應用開發的複雜性
功能:使用基本的JavaBean代替EJB,並提供了更多的企業應用功能
範圍
控制反轉:
控制反轉(IoC=Inversion of Control)IoC,簡單來講,就是由容器控制程式之間的(依賴)關係,而非傳統實現中,由程式程式碼直接操控。這也就是所謂“控制反轉”的概念所在:(依賴)控制權由應用程式碼中轉到了外部容器,控制權的轉移,是所謂反轉。
IoC還有一個另外的名字:“依賴注入 (DI=Dependency Injection)” ,即由容器動態的將某種依賴關係注入到元件之中
IOC/DI:將以前由程式設計師例項化物件/賦值的工作交給了spring處理
ioc值注入方式:
set注入
基本資料型別注入
集合注入
物件注入
構造注入
基本資料型別注入
也就是在實體類中提供代參的構造方法
student
public class Student { //基本型別,集合的注入 public String pwd; public List<String> hobbies; public void methoda() { System.out.println(pwd); System.out.println(hobbies); } public String toString() { return "StudentAction [pwd=" + pwd + ", hobbies=" + hobbies + "]"; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } public List<String> getHobbies() { return hobbies; } public void setHobbies(List<String> hobbies) { this.hobbies = hobbies; }
spring-context.xml
<!-- spring的注入方式 class為全限定名-->
<bean class="com.ioc.Student" id="student">
<!-- get、set方式注入 -->
<!-- 給屬性的資料為基本資料型別注入值 -->
<!-- <property name="pwd" value="1234"></property> -->
<!-- 給屬性的資料為集合注入值 -->
<property name="hobbies">
<list>
<value>吃飯</value>
<value>睡覺</value>
</list>
</property>
<!-- 構造器的方式注入值 -->
<constructor-arg name="pwd" value="1113"></constructor-arg>
</bean>
物件注入
//物件注入
public class UserAction {
// private UserBiz userBiz = new UserBizImpl();
private UserBiz userBiz;
public UserBiz getUserBiz() {
return userBiz;
}
public void setUserBiz(UserBiz userBiz) {
this.userBiz = userBiz;
}
spring-context.xml
<!-- 物件注入 -->
<bean class="com.ioc.biz.impl.UserBizImpl" id="userBiz"></bean>
<bean class="com.ioc.web.UserAction" id="userAction">
<!-- 這個實體類的變數需要提供set/get方法才能注入值 -->
<property name="userBiz" ref="userBiz"></property>
</bean>
自動裝配
byType:
如果說某個Javabean,要使用介面,之前是需要同set注入,或者
構造注入,給一個個介面去注入實現類。當你選擇自動裝配bytype時,那麼
springContext會在整個上下文自動去尋找該介面的實現類
byName:
如果說某個Javabean,要使用介面,是通過介面的屬性名去spring-Context
中去需找id=介面名的實現類
default-autowire="byType"
default-autowire="byName"
匯入spring相關的的jar
maven專案的pom.xml中執行如下程式碼
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.10.RELEASE</version>
</dependency>
tomcat整合ioc容器
原理: 在tomcat中獲得spring中的上下文
1,將已經建模好的applicationContext給存放到servletContext中
2,可以在servletContext中去獲取applicationContext
SpringWebUtil
public class SpringWebUtil {
static String SPRING_CONTEXT_KEY = "spring_context_key";
public static void setApplicationContext(ServletContext servletContext,ApplicationContext applicationContext) {
//將spring的上下文存入到伺服器裡面的上下文中
servletContext.setAttribute(SPRING_CONTEXT_KEY, applicationContext);
}
public static ApplicationContext getApplicationContext(ServletContext servletContext) {
return (ApplicationContext) servletContext.getAttribute(SPRING_CONTEXT_KEY);
}
}
3,監聽服務開啟,載入spring 給spring-context.xml建模
public class SpringLoaderListener implements ServletContextListener{
public void contextInitialized(ServletContextEvent sce) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-context.xml");
ServletContext servletContext = sce.getServletContext();
//獲得配置好的xml檔案的
String str = servletContext.getInitParameter("ljy");
System.out.println("更改的xml" + str);
SpringWebUtil.setApplicationContext(servletContext, applicationContext);
}
public void contextDestroyed(ServletContextEvent sce) {
}
4,在web.xml中配置
<context-param>
<param-name>ljy</param-name>
<param-value>spring.xml</param-value>
</context-param>
<listener>
<listener-class>com.zking.ioc.listen.SpringLoaderListener</listener-class>
</listener>
5,測試
public class UserServlet extends HttpServlet{
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
super.service(req, res);
System.out.println("tomcat整合ioc容器測試");
ServletContext context = req.getServletContext();
ApplicationContext applicationContext = SpringWebUtil.getApplicationContext(context);
BookAction bookAction = (BookAction) applicationContext.getBean("bookAction");
bookAction.method();
}
}