spring 入门
1. 什么是spring,它能够做什么?
Spring是一个开源框架,它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的。
Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。
然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。
目的:解决企业应用开发的复杂性
功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能
范围:任何Java应用
简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
2. 什么是控制反转(或依赖注入)
控制反转(IoC=Inversion of Control)IoC,用白话来讲,就是由容器控制程序之间的(依赖)关系,而非传统实现中,
由程序代码直接操控。这也就是所谓“控制反转”的概念所在:(依赖)控制权由应用代码中转到了外部容器,控制权的转移,是所谓反转。
IoC还有一个另外的名字:“依赖注入 (DI=Dependency Injection)” ,即由容器动态的将某种依赖关系注入到组件之中
IOC/DI
将以前由程序员实例化对象/赋值的工作交给了spring处理
3. 如何在spring当中定义和配置一个JavaBean
3.1 id:在容器中查找Bean的id(唯一、且不能以/开头)
3.2 class:bean的完整类名
3.3 name:在容器中查找Bean的名字(唯一、允许以/开头、允许多个值,多个值之间用逗号或空格隔开)
3.4 scope:(singleton|prototype)默认是singleton
3.4.1 singleton(单例模式):在每个Spring IoC容器中一个bean定义对应一个对象实例
3.4.2 prototype(原型模式/多例模式):一个bean定义对应多个对象实例
3.4 abstract:将一个bean定义成抽象bean(抽象bean是不能实例化的),抽象类一定要定义成抽象bean,非抽象类也可以定义成抽象bean
3.5 parent:指定一个父bean(必须要有继承关系才行)
3.6 init-method:指定bean的初始化方法
3.7 constructor-arg:使用有参数构造方法创建javaBean
代码演示
1、ioc中的注入方式
导入spring需要的pom依赖
1 <project xmlns="http://maven.apache.org/POM/4.0.0"
2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
4 <modelVersion>4.0.0</modelVersion>
5 <groupId>com.yuan</groupId>
6 <artifactId>T226_Spring</artifactId>
7 <packaging>war</packaging>
8 <version>0.0.1-SNAPSHOT</version>
9 <name>T226_Spring Maven Webapp</name>
10 <url>http://maven.apache.org</url>
11 <dependencies>
12 <dependency>
13 <groupId>junit</groupId>
14 <artifactId>junit</artifactId>
15 <version>4.12</version>
16 <scope>test</scope>
17 </dependency>
18
19 <dependency>
20 <groupId>mysql</groupId>
21 <artifactId>mysql-connector-java</artifactId>
22 <version>5.1.44</version>
23 </dependency>
24
25 <dependency>
26 <groupId>javax.servlet</groupId>
27 <artifactId>javax.servlet-api</artifactId>
28 <version>4.0.1</version>
29 <scope>provided</scope>
30 </dependency>
31 <dependency>
32 <groupId>org.springframework</groupId>
33 <artifactId>spring-context</artifactId>
34 <version>4.3.10.RELEASE</version>
35 </dependency>
36
37 </dependencies>
38 <build>
39 <finalName>T226_Spring</finalName>
40 <plugins>
41 <plugin>
42 <groupId>org.apache.maven.plugins</groupId>
43 <artifactId>maven-compiler-plugin</artifactId>
44 <version>3.7.0</version>
45 <configuration>
46 <source>1.8</source>
47 <target>1.8</target>
48 <encoding>UTF-8</encoding>
49 </configuration>
50 </plugin>
51 </plugins>
52 </build>
53 </project>
1. 2、spring-context.xml配置
注:这里需要安装一个spring插件,也可以不安装,因为我是没有安装的,所以不能介绍给大家,如果有需要的话可以百度查看安装教程
其实只需要在xml文件中插入一下代码就欧克了!
1 <beans xmlns="http://www.springframework.org/schema/beans"
2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3
4 xmlns:context="http://www.springframework.org/schema/context"
5 xmlns:tx="http://www.springframework.org/schema/tx"
6 xmlns:aop="http://www.springframework.org/schema/aop"
7 xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
8 http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
9 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
10 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
11 </beans>
接下来看一下xml的配置
1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 default-autowire="byName"
5 xmlns:context="http://www.springframework.org/schema/context"
6 xmlns:tx="http://www.springframework.org/schema/tx"
7 xmlns:aop="http://www.springframework.org/schema/aop"
8 xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
9 http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
10 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
11 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
12 <bean class="com.yuan.ioc.biz.impl.UserBizImpl2" id="userBiz"></bean>
13 <bean class="com.yuan.ioc.web.UserAction" id="yyy">
14 <!-- set注入用property标签 -->
15 <!-- <property name="userBiz" ref="userBiz"></property> -->
16 <!-- <property name="uname" value="zs"></property>
17 <property name="age" value="19"></property> -->
18 <!-- 构造注入用constructor-arg标签 -->
19 <constructor-arg name="uname" value="ls"></constructor-arg>
20 <constructor-arg name="age" value="19"></constructor-arg>
21 <property name="hobby">
22 <list>
23 <value>游戏</value>
24 <value>听歌</value>
25 <value>篮球</value>
26 </list>
27 </property>
28 </bean>
29
30
31 <bean class="com.yuan.ioc.web.OrderAction" id="xxx">
32 <!-- <property name="userBiz" ref="userBiz"></property> -->
33 </bean>
34
35
36 </beans>
1.3、写一个接口
1 package com.yuan.ioc.biz;
2
3 /**
4 * 通过企业的案例来讲解使用spring--ioc的必要性
5 * v1.0 :实现游戏中的上传功能
6 * v2.0 :对游戏的上传功能进行优化
7 *
8 * ioc的具体体现
9 * @authorly
10 *
11 */
12 public interface UserBiz {
13
14 public void upload();
15
16 }
写两个类实现上面的接口
UserBizImpl1
1 package com.yuan.ioc.biz.impl;
2
3 import com.yuan.ioc.biz.UserBiz;
4
5 public class UserBizImpl1 implements UserBiz {
6
7 @Override
8 public void upload() {
9 System.out.println("实现用户上传的功能");
10
11 }
12
13
14 }
UserBizImpl2
1 package com.yuan.ioc.biz.impl;
2
3 import com.yuan.ioc.biz.UserBiz;
4
5 public class UserBizImpl2 implements UserBiz {
6
7 @Override
8 public void upload() {
9 System.out.println("开始优化性能的代码");
10 System.out.println("实现用户上传的功能");
11
12 }
13
14
15 }
实体类 UserAction
1 package com.yuan.ioc.web;
2
3 import java.util.List;
4
5 import com.yuan.ioc.biz.UserBiz;
6
7 /**
8 * IOC的注入方式及各类类型
9 * set注入:
10 * 基本类型与String 属性uname
11 * 数组 List<String> hobby
12 * 自定义类型 userBiz
13 *
14 * 构造注入
15 * 自动装配
16 * spring4之后出现的
17 * byType 根据配置的Bean中的接口,在spring的上下文
18 * byName 根据配置的Bean中的接口名字,在spring的上下文
19 *
20 *
21 * @author ly
22 *
23 */
24 public class UserAction {
25
26 private UserBiz userBiz;
27 private String uname;
28 private int age;
29 private List<String> hobby;
30
31
32
33 public UserAction(String uname, int age) {
34 super();
35 this.uname = uname;
36 this.age = age;
37 }
38
39 public UserAction() {
40 super();
41 }
42
43 public List<String> getHobby() {
44 return hobby;
45 }
46
47 public void setHobby(List<String> hobby) {
48 this.hobby = hobby;
49 }
50
51 public UserBiz getUserBiz() {
52 return userBiz;
53 }
54
55 public void setUserBiz(UserBiz userBiz) {
56 this.userBiz = userBiz;
57 }
58
59 public void upload() {
60 userBiz.upload();
61 }
62
63 /**
64 * 注入问题
65 */
66 public void test1() {
67 System.out.println(this.uname);
68 System.out.println(this.age);
69 System.out.println(this.hobby);
70 }
71
72 }
实体类 OrderAction
1 package com.yuan.ioc.web;
2
3 import com.yuan.ioc.biz.UserBiz;
4
5 public class OrderAction {
6
7 private UserBiz userBiz;
8
9 public UserBiz getUserBiz() {
10 return userBiz;
11 }
12
13 public void setUserBiz(UserBiz userBiz) {
14 this.userBiz = userBiz;
15 }
16
17 public void upload() {
18 userBiz.upload();
19 }
20
21
22 }
测试类 IocTest
1 package com.yuan.ioc.test;
2
3 import org.springframework.context.ApplicationContext;
4 import org.springframework.context.support.ClassPathXmlApplicationContext;
5
6 import com.yuan.ioc.web.OrderAction;
7 import com.yuan.ioc.web.UserAction;
8
9 public class IocTest {
10
11 public static void main(String[] args) {
12
13 UserAction userAction = new UserAction();
14 userAction.upload();
15
16 ApplicationContext springContext = new ClassPathXmlApplicationContext("/spring-context.xml");
17 UserAction userAction = (UserAction) springContext.getBean("yyy");
18 OrderAction orderAction = (OrderAction) springContext.getBean("xxx");
19 userAction.upload();
20 orderAction.upload();
21 userAction.test1();
22
23 }
24
25 }
改变spring-context.xml中的配置
<bean class="com.yuan.ioc.biz.impl.UserBizImpl2" id="userBiz"></bean>
set注入:
* 基本类型与String 属性uname
* 数组 List<String> hobby
* 自定义类型 userBiz
自动装配:
spring4之后出现的
* byType 根据配置的Bean中的接口,在spring的上下文
* byName 根据配置的Bean中的接口名字,在spring的上下文
自动装配只需要更改是spring-context.xml中的default-autowire="byName"或者default-autowire="byType",然后再依次尝试更改bean中的class和id的值
2、spring管理整个工程中的JavaBean
2.1 创建一个监听器 SpringLoaderListenter
1 package com.yuan.ioc.listener;
2
3 import javax.servlet.ServletContext;
4 import javax.servlet.ServletContextEvent;
5 import javax.servlet.ServletContextListener;
6 import javax.servlet.annotation.WebListener;
7
8 import org.springframework.context.ApplicationContext;
9 import org.springframework.context.support.ClassPathXmlApplicationContext;
10
11
12 /**
13 * spring 作为管理整个工程中的所有的JavaBean,
14 * 那么如何在用户发送请求的时候能够访问到指定的JavaBean
15 *
16 * 处理方式:
17 * 在监听器中将spring的上下文交给tomcat的上下文中进行管理
18 * 浏览器请求-->request-->servletContext-->springContext-->任意的JavaBean
19 * @author ly
20 *
21 */
22 @WebListener
23 public class SpringLoaderListener implements ServletContextListener {
24
25 @Override
26 public void contextInitialized(ServletContextEvent sce) {
27
28 System.out.println("tomcat一启动就触发了....");
29 ServletContext tomcatContext = sce.getServletContext();
30 String springXmlLocation = tomcatContext.getInitParameter("springXmlLocation");
31 System.out.println("spring的上下文配置文件"+springXmlLocation);
32 ApplicationContext springContext =null;
33 if(springXmlLocation == null || "".equals(springXmlLocation)) {
34
35 springContext = new ClassPathXmlApplicationContext("/spring-context.xml");
36 }else {
37 springContext = new ClassPathXmlApplicationContext(springXmlLocation);
38 }
39 tomcatContext.setAttribute("spring_key", springContext);
40
41 }
42
43
44 }
2.2 创建servlet UserServlet
1 package com.yuan.ioc.web;
2
3 import java.io.IOException;
4
5 import javax.servlet.ServletException;
6 import javax.servlet.annotation.WebServlet;
7 import javax.servlet.http.HttpServlet;
8 import javax.servlet.http.HttpServletRequest;
9 import javax.servlet.http.HttpServletResponse;
10
11 import org.springframework.context.ApplicationContext;
12
13 @WebServlet("/user")
14 public class UserServlet extends HttpServlet {
15
16 @Override
17 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
18 doPost(req, resp);
19 }
20
21 @Override
22 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
23 System.out.println("处理用户请求");
24 ApplicationContext springContext = (ApplicationContext) req.getServletContext().getAttribute("spring_key");
25 UserAction userAction = (UserAction) springContext.getBean("yyy");
26 userAction.upload();
27 }
28
29 }
测试 IocTest
1 package com.yuan.ioc.test;
2
3 import org.springframework.context.ApplicationContext;
4 import org.springframework.context.support.ClassPathXmlApplicationContext;
5
6 import com.yuan.ioc.web.OrderAction;
7 import com.yuan.ioc.web.UserAction;
8
9 public class IocTest {
10
11 public static void main(String[] args) {
12
13 // UserAction userAction = new UserAction();
14 // userAction.upload();
15
16 ApplicationContext springContext = new ClassPathXmlApplicationContext("/spring-context.xml");
17 UserAction userAction = (UserAction) springContext.getBean("yyy");
18 OrderAction orderAction = (OrderAction) springContext.getBean("xxx");
19 userAction.upload();
20 orderAction.upload();
21 // userAction.test1();
22
23 }
24
25 }
谢谢观看 !!!