美文网首页
Spring 讲解(一 )

Spring 讲解(一 )

作者: RookieMZL | 来源:发表于2019-11-04 01:02 被阅读0次

    1、如何理解 Spring 框架

    简单来说,Spring 是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架

    因为以前写代码的时候,在使用类对象的时候,经常需要实例化创建(new 出来)很多对象,有时候只需要实例化一次对象即可(不管这个对象是 service 或者 dao),让这个对象去做该做的事情。

    而Spring框架就是管理这些对象的,让 Spring 容器装配管理这些对象,程序猿需要时再取出来使用,让对象的创建和使用更加方便。

    【Bean其实就是一个new好的对象】

    2、使用 Spring 的好处

    • 方便解耦,简化开发

      Spring就是一个大工厂,专门负责生成Bean,可以将所有对象创建和依赖关系维护由Spring管理。

    • AOP编程的支持

      Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能。

    • 声明式事务的支持

      只需要通过配置就可以完成对事务的管理,而无需手动编程。

    • 方便程序的测试

      Spring对Junit4支持,可以通过注解方便的测试Spring程序。

    • 方便集成各种优秀框架

      Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、Hibernate、MyBatis、Quartz等)的支持。

    • 降低JavaEE API的使用难度

      对JavaEE开发中一些难用的API(JDBC、JavaMail、远程调webservice用等),都提供了封装,使这些API应用难度大大降低。

    3、说了这么多,是骡子是马,拉出来溜溜(案例演示)

    • 创建接口和实现类

      public interface UserService {
          void add();
      }
      
      =============================================================================
      public class UserServiceImpl implements UserService {
          @Override
          public void add() {
              System.out.println("创建用户....");
          }
      }
      
    • 不使用 Spring 调用对象方法

      public class ServiceTest {
          public static void main(String[] args) {
              UserService userService=new UserServiceImpl();
              userService.add();
          }
      }
      

      控制台打印结果日志:创建用户....

    • 使用 Spring 管理对象

      首先需要创建 bean.xml 文件
      <?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 【对象】-->
                  <bean id="userService" class="com.example.demo.service.impl.UserServiceImpl"/>
      </beans>
      
       public class ServiceTest {
           public static void main(String[] args) {
      
               //1.加载beans.xml 这个spring的配置文件,内部就会创建对象
               ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
      
               //2.从spring容器获取 userSerivce对象
               UserService userSerivce1 = (UserService) context.getBean("userService");
               userSerivce1.add();
      
               UserService userSerivce2 = (UserService) context.getBean("userService");
               userSerivce2.add();
      
               System.out.println(userSerivce1);
               System.out.println(userSerivce2);
           }
       }
      

    控制台打印结果日志如下:

    创建用户....

    创建用户....

    com.example.demo.service.impl.UserServiceImpl@3b088d51
    com.example.demo.service.impl.UserServiceImpl@3b088d51

    可以看出是Spring在启动加载配置文件 bean.xml 的时候,会在容器中创建好这个对象,需要使用的时候直接获取就可以。

    相比以前每次都要 new(频繁 new 对象的过程对程序开销很大) 一个对象。交给 Spring 容器后这个对象只会创建一次,所以打印的地址值是一样的。

    2、对 Spring 中 IOC 和 DI 讲解

    • IoC 反转控制

      就是将原本在程序中手动创建 UserService 对象的控制权,交由 Spring 框架管理。简单说就是创建 UserService 对象控制权被反转到了 Spring 框架。

    • DI 依赖注入

      在 Spring 框架负责创建 Bean 对象时,动态的将依赖对象注入到 Bean 组件。

    • 对依赖注入(DI)案例演示

      public class UserServiceImpl implements UserService {
      
          private String name;
        
        // 可以注释掉 getName 方法
          public String getName() {return name;}
      
          // setName 方法不可以注释掉
          public void setName(String name) {this.name = name;}
      
          @Override
          public void add() {
              System.out.println("创建用户...." + name);
          }
      }
      
       <?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 【对象】-->
                  <bean id="userService" class="com.example.demo.service.impl.UserServiceImpl">
                      <!-- 依赖注入数据,调用属性的set方法 -->
                      <property name="name" value="zhangsan"></property>
                  </bean>
              </beans>
      

      运行原来的 Main 方法,控制台打印结果日志如下:

      创建用户....zhangsan

      创建用户....zhangsan

      com.example.demo.service.impl.UserServiceImpl@7a187f14
      com.example.demo.service.impl.UserServiceImpl@7a187f14

    • 重点

      UserServiceImpl 中如果注释掉 getName ,程序不出错。如果注释掉 setName 方法,则会报错如下所示,至于报错的原因,请看下一篇讲解。

      Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userService' defined in class path resource [beans.xml]: Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'name' of bean class [com.example.demo.service.impl.UserServiceImpl]: Bean property 'name' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1718)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1433)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:592)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515)
        at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:845)
        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:877)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549)
        at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:144)
        at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:85)
        at com.example.demo.testservice.ServiceTest.main(ServiceTest.java:16)
      Caused by: org.springframework.beans.NotWritablePropertyException: Invalid property 'name' of bean class [com.example.demo.service.impl.UserServiceImpl]: Bean property 'name' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?
        at org.springframework.beans.BeanWrapperImpl.createNotWritablePropertyException(BeanWrapperImpl.java:243)
        at org.springframework.beans.AbstractNestablePropertyAccessor.processLocalProperty(AbstractNestablePropertyAccessor.java:426)
        at org.springframework.beans.AbstractNestablePropertyAccessor.setPropertyValue(AbstractNestablePropertyAccessor.java:278)
        at org.springframework.beans.AbstractNestablePropertyAccessor.setPropertyValue(AbstractNestablePropertyAccessor.java:266)
        at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:97)
        at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:77)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1714)
        ... 13 more
      

    相关文章

      网友评论

          本文标题:Spring 讲解(一 )

          本文链接:https://www.haomeiwen.com/subject/clhrbctx.html