spring框架

1.spring框架

1.1什么是spring框架

Spring是分层的 Java SE/EE应用 full-stack 轻量级开源框架,以 IoC(Inverse Of Control:反转控制)和 AOP(Aspect Oriented Programming:面向切面编程)为内核。

提供了展现层 SpringMVC 和持久层 Spring JDBCTemplate 以及业务层事务管理等众多的企业级应用技术,还能整合开源世界众多著名的第三方框架和类库,逐渐成为使用最多的Java EE 企业应用开源框架。

 1.2spring的优点

1)方便解耦,简化开发 通过 Spring 提供的 IoC容器,可以将对象间的依赖关系交由 Spring 进行控制,避免硬编码所造成的过度耦合。 用户也不必再为单例模式类、属性文件解析等这些很底层的需求编写代码,可以更专注于上层的应用。

2)AOP 编程的支持 通过 Spring的 AOP 功能,方便进行面向切面编程,许多不容易用传统 OOP 实现的功能可以通过 AOP 轻松实现。

3)声明式事务的支持 可以将我们从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活的进行事务管理,提高开发效率和质量。

4)方便程序的测试 可以用非容器依赖的编程方式进行几乎所有的测试工作,测试不再是昂贵的操作,而是随手可做的事情。

5)方便集成各种优秀框架 Spring对各种优秀框架(Struts、Hibernate、Hessian、Quartz等)的支持。

6)降低 JavaEE API 的使用难度 Spring对 JavaEE API(如 JDBC、JavaMail、远程调用等)进行了薄薄的封装层,使这些 API 的使用难度大为降低。

7)Java 源码是经典学习范例 Spring的源代码设计精妙、结构清晰、匠心独用,处处体现着大师对Java 设计模式灵活运用以及对 Java技术的高深 造诣。它的源代码无意是 Java 技术的最佳实践的范例。

1.3为什么使用spring?

 目的:降低耦合:对象与对象之间的耦合。

我们先用我们原来的方式写一段代码 .

1、先写一个UserDao接口

public interface UserDao {
   public void getUser();
}

2、再去写Dao的实现类

public class UserDaoImpl implements UserDao {
   @Override
   public void getUser() {
       System.out.println("获取用户数据");
  }
}

3、然后去写UserController的接口

public interface UserController {
   public void getUser();
}

4、最后写controller的实现类

public class UserControllerImpl implements UserController {
   private UserDao userDao = new UserDaoImpl();
​
   @Override
   public void getUser() {
       userDao.getUser();
  }
}

5、测试一下

@Test
public void test(){
   UserController controller = new UserControllerImpl();
   controller.getUser();
}

这是我们原来的方式 , 开始大家也都是这么去写的对吧 . 那我们现在修改一下 .

把Userdao的实现类增加一个 .

public class UserDaoMySqlImpl implements UserDao {
   @Override
   public void getUser() {
       System.out.println("MySql获取用户数据");
  }
}

紧接着我们要去使用MySql的话 , 我们就需要去controller实现类里面修改对应的实现

public class UserControllerImpl implements UserController {
   private UserDao userDao = new UserDaoMySqlImpl();
​
   @Override
   public void getUser() {
       userDao.getUser();
  }
}

在假设, 我们再增加一个Userdao的实现类 .

public class UserDaoOracleImpl implements UserDao {
   @Override
   public void getUser() {
       System.out.println("Oracle获取用户数据");
  }
}

那么我们要使用Oracle , 又需要去controller实现类里面修改对应的实现 . 假设我们的这种需求非常大 , 这种方式就根本不适用了, 甚至反人类对吧 , 每次变动 , 都需要修改大量代码 . 这种设计的耦合性太高了, 牵一发而动全身 .

那我们如何去解决呢 ?

我们可以在需要用到他的地方 , 不去实现它 , 而是留出一个接口 , 利用set , 我们去代码里修改下 .

public class UserControllerImpl implements UserController {
   private UserDao userDao;
// 利用set实现
   public void setUserDao(UserDao userDao) {
       this.userDao = userDao;
  }
​
   @Override
   public void getUser() {
       userDao.getUser();
  }
}

现在去我们的测试类里 , 进行测试 ;

@Test
public void test(){
   UserControllerImpl controller = new UserControllerImpl();
   controller.setUserDao( new UserDaoMySqlImpl() );
   controller.getUser();
   //那我们现在又想用Oracle去实现呢
   controller.setUserDao( new UserDaoOracleImpl() );
   controller.getUser();
}

大家发现了区别没有 ? 可能很多人说没啥区别 . 但是同学们 , 他们已经发生了根本性的变化 , 很多地方都不一样了 . 仔细去思考一下 , 以前所有东西都是由程序去进行控制创建 , 而现在是由我们自行控制创建对象 , 把主动权交给了调用者 . 程序不用去管怎么创建,怎么实现了 . 它只负责提供一个接口 .

这种思想 , 从本质上解决了问题 , 我们程序员不再去管理对象的创建了 , 更多的去关注业务的实现 . 耦合性大大降低 . 这也就是IOC的原型 !

1.4什么是ioc

控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。使用对象的时候不再是我们直接new,而是将创建对象的权利交给框架中的核心容器,需要使用对象的时候直接从容器中获取。

1.5如何使用spring

 

(1)添加相应的依赖

<!--引入依赖:-->
<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.2.9.RELEASE</version>
    </dependency>
</dependencies>

(2)创建spring配置文件。----spring的容器。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
​
    <!--bean:表示该类交于spring容器来管理。
           id:唯一表示。方便别人通过该id的值找到对应的对象。
           class:表示全类名
    -->
    <bean id="hello01" class="com.ykq.HelloWorld"></bean>
</beans>

(3)测试

public static void main(String[] args) {
     //1.读取spring的配置文件。
    ApplicationContext app=new ClassPathXmlApplicationContext("spring01.xml");
    //2.从容器中获取指定的对象。
    HelloWorld hello01 = (HelloWorld) app.getBean("hello01");
    //3.通过对象调用类中相应的成员
    hello01.show();
    hello01.print();
}

思考

  • Hello 对象是谁创建的 ? 【hello 对象是由Spring创建的

  • Hello 对象的属性是怎么设置的 ? hello 对象的属性是由Spring容器设置的

这个过程就叫控制反转 :

  • 控制 : 谁来控制对象的创建 , 传统应用程序的对象是由程序本身控制创建的 , 使用Spring后 , 对象是由Spring来创建的

  • 反转 : 程序本身不创建对象 , 而变成被动的接收对象 .

1.6 DI依赖注入

Dependency Injection

概念

  • 依赖注入(Dependency Injection,DI)。

  • 依赖 : 指Bean对象的创建依赖于容器 . Bean对象的依赖资源 .

  • 注入 : 指Bean对象所依赖的资源 , 由容器来设置和装配 .

1.7 注入的方式:

1.通过set方法注入。用的非常多。

   
 <bean id="userService" class="com.ykq.service.UserService">
        <!--property:为类中属性赋值通过set方法赋值。name:表示属性名.
                        ref:值的引用
        -->
        <property name="userDao" ref="mysql"/>
    </bean>

2.通过构造方法。class类不是你定义,而是使用别人的类,而别人写的类没有无参构造函数。

<bean id="userService" class="com.ykq.service.UserService">
          <!--通过构造方法为类中属性注入:参数的下标-->
<!--          <constructor-arg index="0" ref="oracle"/>-->
        <!--通过构造方法为类中属性注入:参数名称-->
<!--         <constructor-arg name="userDao" ref="mysql"/>-->
         <constructor-arg type="com.ykq.dao.UserDao" ref="mysql"/>
    </bean>

1.8 注入的数据类型。

(1)基本数据类型或者字符串。

(2)引用类型--对象类型。

(3)集合List,Set。

(4)map集合。

(5)数组

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
​
​
    <bean id="clazz01" class="com.ykq.di.Clazz">
        <!--如果是基本类型和字符串类型注入值时 使用value-->
         <property name="cid" value="145"/>
         <property name="cname" value="QY145"/>
    </bean>
​
    <bean id="stu" class="com.ykq.di.Student">
          <property name="name" value=""/>
          <property name="age" value="25"/>
          <!--如果属性类型为对象类型。ref-->
          <property name="clazz" ref="clazz01"/>
​
        <!--属性类型为list类型 <list></list>-->
          <property name="list">
               <list>
                    <value></value>
                    <value></value>
                    <value></value>
                    <value></value>
                    <value></value>
               </list>
          </property>
​
          <property name="set">
               <set>
                   <value></value>
                   <value></value>
                   <value></value>
                   <value></value>
                   <value></value>
               </set>
          </property>
​
        <!--map属性类型-->
          <property name="map">
               <map>
                   <entry key="name" value=""/>
                   <entry key="age" value=""/>
                   <entry key="sex" value=""/>
               </map>
          </property>
​
        <property name="arr">
             <array>
                 <value>110</value>
                 <value>120</value>
                 <value>130</value>
                 <value>119</value>
             </array>
        </property>
​
    </bean>
​
</beans>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值