Spring框架

Posted 戒急静心

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring框架相关的知识,希望对你有一定的参考价值。

 

一、spring框架概念

  spring是众多开源java项目中的一员,基于分层的javaEE应用一站式轻量级开源框架,主要核心是Ioc(控制反转/依赖注入) 与Aop(面向切面)两大技术,实现项目在开发过程中的轻松解耦,并极大的提高项目的开发效率。

   在项目中引入spring立即可以带来下面的好处 降低组件之间的耦合度,实现软件各层之间的解耦。可以使用容器提供的众多服务,如:事务管理服务、消息服务等等。当我们使用容器管理事务时,开发人员就不再需要手工控制事务.也不需处理复杂的事务传播。 容器提供单例模式支持,开发人员不再需要自己编写实现代码。 容器提供了AOP技术,利用它很容易实现如权限拦截、运行期监控等功能。

二、spring的七大模块

组成 Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。

  1. 核心容器Spring Core: 核心容器提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转 (IOC) 思想将应用程序的配置和依赖性规范与实际的应用程序代码分开。
  2. Spring 上下文Spring Context:Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。
  3. Spring AOP:通过配置管理特性,Spring AOP 模块直接将面向切面的编程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何对象支持 AOP。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,就可以将声明性事务管理集成到应用程序中。
  4. Spring DAO:JDBC DAO  抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。
  5. Spring ORM:Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。
  6. Spring Web 模块:Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以,Spring 框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。
  7. Spring MVC 框架:MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。

 

思考:Bean 是如何被实例化的?---工厂模式(简单模拟实现工厂模式)

简单工厂模式:抽象产品角色,具体产品角色,工厂角色

 

三、Spring  Ioc(控制反转/依赖注入)(Dependency Injection 即DI)

  原先我们是通过手动的方式实例化new我们的对象,

  现在将原先的过程交给我们web容器(spring)来进行创建,这个过程叫做控制反转、依赖注入。

  目的:实现解耦

 

 

四、Spring  Ioc实例化bean对象的三种方式

    1、构造器的方式实例化bean对象

    

    

    2、静态工厂方法方式实例化bean(了解即可)

      特点:

        I.要有该工厂类及工厂方法 

        II.工厂方法为静态的

 

    

    3、 实例化工厂方式创建bean(了解即可)      

        相比较静态工厂实现

        I.工厂方法为非静态方法

        II.需要配置工厂bean,并在业务bean中配置factory-bean,factory-method属性

      

spring三种实例化bean的方式比较

    方式一:通过bean的缺省构造函数创建,当各个bean的业务逻辑相互比较独立的时候或者和外界关联较少的时候可以使用。

    方式二:利用静态factory方法创建,可以统一管理各个bean的创建,如各个bean在创建之前需要相同的初始化处理,则可用这个factory方法险进行统一的处理等等。

    方式三:利用实例化factory方法创建,即将factory方法也作为了业务bean来控制,1可用于集成其他框架的bean创建管理方法,2能够使bean和factory的角色互换。

     开发中项目一般使用一种方式实例化bean,采用第一种方式最好,交给spring托管,使用时直接拿来使用即可。另外两种了解即可

 五、Spring  Ioc 4种注入方式

  1)Set注入

   xml配置(同时 spring 也提供了对于基本数据类型的set注入方式)

  

 1 <!-- 
 2         id:名称唯一,一般是类名的全称,第一个首字母小写
 3         class:bean的全限命名 
 4      -->
 5      <!-- set注入 -->
 6     <bean id="userService" class="com.wisezone.service.UserService">
 7         <property name="userDao" ref="userDao"></property>
 8         <property name="age" value="23"></property>
 9         <property name="sex" value="1"></property>
10         <property name="name" value="张三"></property>
11     </bean>
12     
13     <bean id="userDao" class="com.wisezone.dao.UserDao"></bean>

 

    java类

     

1 package com.wisezone.dao;
2 
3 public class UserDao {
4     
5     public void save(){
6         System.out.println("保存用户记录!");
7     }
8 }
 1 package com.wisezone.service;
 2 
 3 import com.wisezone.dao.UserDao;
 4 
 5 public class UserService {
 6     
 7     private UserDao userDao;
 8     
 9     private Integer age;//年龄
10     
11     private boolean sex;//性别
12     
13     private String name;//姓名
14     
15     
16     public void setAge(Integer age) {
17         this.age = age;
18     }
19 
20     public void setSex(boolean sex) {
21         this.sex = sex;
22     }
23 
24     public void setName(String name) {
25         this.name = name;
26     }
27 
28     public void setUserDao(UserDao userDao) {
29         this.userDao = userDao;
30     }
31 
32     public String save(){
33         System.out.println("age:"+age+"--->sex:"+sex+"--->name:"+name);
34         userDao.save();
35         return "hello spring";
36     }
37 }
 1 package com.wisezone.test;
 2 
 3 import static org.junit.Assert.*;
 4 
 5 import org.junit.Test;
 6 import org.springframework.context.ApplicationContext;
 7 import org.springframework.context.support.ClassPathXmlApplicationContext;
 8 import org.springframework.context.support.FileSystemXmlApplicationContext;
 9 
10 import com.wisezone.service.UserService;
11 
12 public class TestUserService {
13 
14     @Test
15     public void test() {
16         /**
17          * 1、启动容器
18          * 2、获取bean
19          * 3、调用bean方法,打印信息
20          */
21         //1、传入xml  启动spring 容器
22         ApplicationContext ac  = new ClassPathXmlApplicationContext("beans.xml");
23         
24         //2、获取bean 
25         UserService userService = (UserService) ac.getBean("userService");
26         
27         //3、调用bean方法,打印信息
28         System.out.println(userService.save());
29     }
30 
31 }

结果:

  

  2)构造器注入

  xml配置(也提供对于基本数据类型的构造器注入值得方式)

   

 1 <!-- 构造器注入 -->
 2     <!-- <bean id="userService2" class="com.wisezone.service.UserService2">
 3         <constructor-arg name="userDao" ref="userDao"></constructor-arg>
 4         <constructor-arg name="userName" value="admin"></constructor-arg>
 5         <constructor-arg name="addr" value="上海上海"></constructor-arg>
 6     </bean> -->
 7     
 8     <!-- 以index下标同样可以实现赋值 -->
 9     <bean id="userService2" class="com.wisezone.service.UserService2">
10         <constructor-arg index="0" ref="userDao"></constructor-arg>
11         <constructor-arg index="1" value="admin"></constructor-arg>
12         <constructor-arg index="2" value="上海上海"></constructor-arg>
13     </bean>
14     
15     <bean id="userDao" class="com.wisezone.dao.UserDao"></bean>

 

  java类

  

 1 package com.wisezone.service;
 2 
 3 import com.wisezone.dao.UserDao;
 4 
 5 public class UserService2 {
 6     
 7     private UserDao userDao;
 8     
 9     private String userName;
10     
11     private String addr;
12     
13     
14     //带参构造
15     public UserService2(UserDao userDao,String userName,String addr) {
16         super();
17         this.userDao = userDao;
18         this.userName = userName;
19         this.addr = addr;
20     }
21 
22 
23     public String save(){
24         System.out.println("userName:"+userName+"---->>>addr:"+addr);
25         userDao.save();
26         return "hello spring";
27     }
28 }
 1 package com.wisezone.test;
 2 
 3 import static org.junit.Assert.*;
 4 
 5 import org.junit.Test;
 6 import org.springframework.context.ApplicationContext;
 7 import org.springframework.context.support.ClassPathXmlApplicationContext;
 8 import org.springframework.context.support.FileSystemXmlApplicationContext;
 9 
10 import com.wisezone.service.UserService;
11 import com.wisezone.service.UserService2;
12 
13 public class TestUserService2 {
14 
15     @Test
16     public void test() {
17         /**
18          * 1、启动容器
19          * 2、获取bean
20          * 3、调用bean方法,打印信息
21          */
22         //1、传入xml  启动spring 容器
23         ApplicationContext ac  = new ClassPathXmlApplicationContext("beans.xml");
24         
25         //2、获取bean 
26         UserService2 userService2 = (UserService2) ac.getBean("userService2");
27         
28         //3、调用bean方法,打印信息
29         System.out.println(userService2.save());
30     }
31 
32 }

结果:

   3)静态工厂注入

  

 1 <!-- 
 2         id:名称唯一,一般是类名的全称,第一个首字母小写
 3         class:bean的全限命名 
 4      -->
 5      <!-- set注入 -->
 6     <bean id="userService" class="com.wisezone.service.UserService">
 7         <property name="userDao" ref="staticFactory"></property>
 8     </bean>
 9     
10     <!-- 静态工厂注入 -->
11     <bean id="staticFactory" class="com.wisezone.factory.StaticFactory" factory-method="getUserDao">
12     </bean>

  java类

1 package com.wisezone.dao;
2 
3 public class UserDao {
4     
5     public void save(){
6         System.out.println("保存用户记录!");
7     }
8 }
 1 package com.wisezone.factory;
 2 
 3 import com.wisezone.dao.UserDao;
 4 import com.wisezone.service.UserService;
 5 
 6 /**
 7  * 静态工厂实列化Bean
 8  * @author 王东海
 9  * @2017年4月27日
10  */
11 public class StaticFactory {
12     
13     public static UserService getUserService(){
14         
15         return new UserService();
16     }
17     
18     public static UserDao getUserDao(){
19         
20         return new UserDao();
21     }
22 }    
 1 package com.wisezone.service;
 2 
 3 import com.wisezone.dao.UserDao;
 4 
 5 public class UserService {
 6     
 7     private UserDao userDao;
 8     
 9 
10     public void setUserDao(UserDao userDao) {
11         this.userDao = userDao;
12     }
13 
14     public String save(){
15         userDao.save();
16         return "这是一个spring学习的开始。。。静态工厂注入";
17     }
18 }
 1 package com.wisezone.test;
 2 
 3 import static org.junit.Assert.*;
 4 
 5 import org.junit.Test;
 6 import org.springframework.context.ApplicationContext;
 7 import org.springframework.context.support.ClassPathXmlApplicationContext;
 8 import org.springframework.context.support.FileSystemXmlApplicationContext;
 9 
10 import com.wisezone.service.UserService;
11 
12 public class TestUserService {
13 
14     @Test
15     public void test() {
16         /**
17          * 1、启动容器
18          * 2、获取bean
19          * 3、调用bean方法,打印信息
20          */
21         //1、传入xml  启动spring 容器
22         ApplicationContext ac  = new ClassPathXmlApplicationContext("beans.xml");
23         
24         //2、获取bean 
25         UserService userService = (UserService) ac.getBean("userService");
26         
27         //3、调用bean方法,打印信息
28         System.out.println(userService.save());
29     }
30 
31 }

结果:

   4)实例化工厂注入

 1 <!-- 
 2         id:名称唯一,一般是类名的全称,第一个首字母小写
 3         class:bean的全限命名 
 4      -->
 5     <!-- 实例化工厂注入 -->
 6     <bean id="instanceFactory" class="com.wisezone.factory.InstanceFactory"></bean>
 7     
 8     <bean id="userDao" factory-bean="instanceFactory" factory-method="getUserDao"></bean>
 9      <!-- set注入 -->
10     <bean id="userService" class="com.wisezone.service.UserService">
11         <property name="userDao" ref="userDao"></property>
12     </bean>

  java类

 

1 package com.wisezone.dao;
2 
3 public class UserDao {
4     
5     public void save(){
6         System.out.println("保存用户记录!");
7     }
8 }

 

 1 package com.wisezone.factory;
 2 import com.wisezone.dao.UserDao;
 3 import com.wisezone.service.UserService;
 4 /**
 5  * 实列化工厂
 6  * @author 王东海
 7  * @2017年4月27日
 8  */
 9 public class InstanceFactory {
10     
11     public  UserService getUserService()
12     {
13         return new UserService();
14     }
15     
16     public UserDao getUserDao(){
17         
18         return new UserDao();
19     }
20 
21 }
 1 package com.wisezone.service;
 2 
 3 import com.wisezone.dao.UserDao;
 4 
 5 public class UserService {
 6     
 7     private UserDao userDao;
 8     
 9 
10     public void setUserDao(UserDao userDao) {
11         this.userDao = userDao;
12     }
13 
14     public String save(){
15         userDao.save();
16         return "spring实列化工厂注入测试。。。。";
17     }
18 }
 1 package com.wisezone.test;
 2 
 3 import static org.junit.Assert.*;
 4 
 5 import org.junit.Test;
 6 import org.springframework.context.ApplicationContext;
 7 import org.springframework.context.support.ClassPathXmlApplicationContext;
 8 import org.springframework.context.support.FileSystemXmlApplicationContext;
 9 
10 import com.wisezone.service.UserService;
11 
12 public class TestUserService {
13 
14     @Test
15     public void test() {
16         /**
17          * 1、启动容器
18          * 2、获取bean
19          * 3、调用bean方法,打印信息
20          */
21         //1、传入xml  启动spring 容器
22         ApplicationContext ac  = new ClassPathXmlApplicationContext("beans.xml");
23         
24         //2、获取bean 
25         UserService userService = (UserService) ac.getBean("userService");
26         
27         //3、调用bean方法,打印信息
28         System.out.println(userService.save());
29     }
30 
31 }

结果:

  

 六、Ioc集合类型属性注入(了解)

  1)list集合注入


1 <property name="list">
2             <list>
3                 <value>java01</value>
4                 <value>java02</value>
5                 <value>java03</value>
6                 <value>java04</value>
7             </list>            
8         </property>

结果:

    2)set集合注入

1 <property name="set">
2             <set>
3                 <value>10</value>
4                 <value>20</value>
5                 <value>30</value>
6                 <value>40</value>
7                 <value>50</value>
8             </set>
9         </property>

 

    3)map类型属性注入

 1 <property name="map">
 2             <map>
 3                 <entry>
 4                     <key>
 5                         <value>a</value>    <!-- key值 -->
 6                     </key>
 7                     <value>hellojava</value>    <!-- key对应value值 -->
 8                 </entry>
 9                 <entry>
10                     <key>
11                         <value>b</value>    <!-- key值 -->
12                     </key>
13                     <value>helloworld</value>    <!-- key对应value值 -->
14                 </entry>
15             </map>
16         </property>

 

     4)properties属性注入

1 <property name="properties">
2             <props>
3                 <prop key="a">test01</prop>
4                 <prop key="b">test02</prop>
5                 <prop key="c">test03</prop>
6                 <prop key="d">test04</prop>
7             </props>
8         </property>

 

 

-----------------------------------------总代码----------------------------------------------------------

 1 package com.wisezone.service;
 2 
 3 import java.util.List;
 4 import java.util.Map;
 5 import java.util.Map.Entry;
 6 import java.util.Properties;
 7 import java.util.Set;
 8 
 9 
10 public class UserService2 {
11     
12     //1、list集合注入
13     private List<String> list;
14     
15     //2、set集合注入
16     private Set<Double> set;
17     
18     //3、map类型属性注入
19     private Map<String, String> map;
20     
21     //4、Properties属性注入
22     private Properties properties;
23 
24 
25     public void setList(List<String> list) {
26         this.list = list;
27     }
28     
29     public void setSet(Set<Double> set) {
30         this.set = set;
31     }
32     
33     public void setMap(Map<String, String> map) {
34         this.map = map;
35     }
36 
37     public以上是关于Spring框架的主要内容,如果未能解决你的问题,请参考以下文章

初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段

初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段

使用实体框架迁移时 SQL Server 连接抛出异常 - 添加代码片段

Spring boot:thymeleaf 没有正确渲染片段

What's the difference between @Component, @Repository & @Service annotations in Spring?(代码片段

spring练习,在Eclipse搭建的Spring开发环境中,使用set注入方式,实现对象的依赖关系,通过ClassPathXmlApplicationContext实体类获取Bean对象(代码片段