spring简介:
Spring是一个开源框架,它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的。
Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
目的:解决企业应用开发的复杂性
功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能
范围:任何Java应用
控制反转:
控制反转(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();
}
}