美文网首页
Spring入门

Spring入门

作者: 笔者7 | 来源:发表于2017-04-05 23:29 被阅读0次

    一:Spring的特点

    1、Spring:春天;--给软件行业带来了春天
    2、理念:使现有的技术更加实用。本身是大杂烩整合现有的框架技术
    3、Spring优点
    轻量级框架
    Ioc容器---控制反转
    Aop面向切面编程
    对事物的支持
    对框架的支持
    4、主要内容


    图片1.png

    5、Ioc--inversion of control控制反转
    对象由原来程序本身来创建,变为了程序接收对象。程序员主要精力集中于业务实现。实现了service和dao的解耦工作。Service层和dao层实现了分离。没有直接依赖关系。
    6、hello spring
    步骤:导入相关jar包
    commons-logging-1.1.1.jar
    spring-aop-4.0.0.RELEASE.jar
    spring-beans-4.0.0.RELEASE.jar
    spring-context-4.0.0.RELEASE.jar
    spring-core-4.0.0.RELEASE.jar
    spring-expression-4.0.0.RELEASE.jar
    编写spring配置文件(名称可以自己起)习惯用applicationContext.xml

    Hello.java

    public class Hello {    
            private String name;
            public void setName(String name) {
                this.name = name;
            }
            public void show(){
                System.out.println("hello,"+name);
            }
        }
    

    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 id="hello" class="com.aiyin.spring.bean.Hello">
          <property name="name" value="Spring"></property>
        </bean>
    </beans>
    

    测试代码

    public class Test {
        public static void main(String[] args) {
            //解析beans.xml文件 生成管理相应的bean对象
            BeanFactory context = new  ClassPathXmlApplicationContext("beans.xml");
            //Hello hello = (Hello)context.getBean("h4");
            Hello hello= context.getBean(Hello.class);
            hello.show();
        }
    }
    

    思考?
    Hello对象由谁创建?(Hello对象由Spring容器创建的)
    Hello对象属性是怎么设置的?(Hello对象属性是Spring容器来设置的)

    这个过程叫做控制反转

    控制的内容:指谁来控制对象的创建。。传统的应用程序对象的创建是由程序本身控制的。使用Spring后,是由spring来创建对象的。
    反转:正转指程序来创建对象,反转指程序本身不去创建对象,而变为被动的接收的对象。

    总结: 以前对象是由程序本身来创建,使用Spring后,程序变为被动接收spring创建好的对象

    二:使用Ioc来创建对象有3种方式

    • A)通过无参的构造方法来创建set方法注入
      user.java
    public class Hello {
          Public  Hello (){
             System.out.println("user通过无参构造方法创建");
           }
          private String name;
          public void setName(String name) {
              this.name = name;
          }
          public void show(){
              System.out.println("hello,"+name);
          }
      }
    

    bean.xml

    <bean id="hello" class="com.aiyin.spring.bean.Hello">
          <property name="name" value="Spring"></property>
        </bean>
    
    • B)通过有参的构造方法来创建 构造方法注入
      user.java
    public class User {
            public User(String name) {
                super();
                this.name = name;
            }
            private String name;
            public void show(){
                System.out.println("name="+name);
            }
    

    bean.xml

    第一种 根据参数的下标来设置
    <bean id="user" class="com.aiyin.spring.vo.User">
          <!-- index指构造方法  参数下标从0开始 -->
          <constructor-arg index="0" value="李四"></constructor-arg>
        </bean>
    第二种 根据参数名称来设置
    <bean id="user" class="com.aiyin.spring.vo.User">
          <!-- name指参数名  -->
          <constructor-arg name="name" value="李四"></constructor-arg>
        </bean>
    第三种 根据参数类型来设置
    <bean id="user" class="com.aiyin.spring.vo.User">
          <!-- 参数类型  -->
          <constructor-arg type="java.lang.String" value="李四"></constructor-arg>
        </bean>
    

    三:配置文件详解

    1、align:为bean设置别名,可以设置多个别名

    <!-- 设置别名 -->
        <alias name="user" alias="aaa"/>
    

    2、bean的配置

    <!-- bean就是java对象  由spring来创建和管理 -->    
       <!-- id是bean的标识符 要唯一  如果没有配置id,name默认标识符 
            如果配置id,又配置了name 那么name是别名
            name可以设置多个别名 分隔符可以 是 空格 逗号 分号
            class是bean的全限定名=包名+类名
            如果不配置 id,和name 那么可以根据applicationContext.getBean(Class) 获取对象
       -->
      <bean id="user" name="user2,u3 u4" class="com.aiyin..."
    

    3、团队协作开发通过improt来实现

    import resource="com/aiyin/spring/bean/beans.xml"/>
    

    自动装配

    <bean id="userDao" class="com.aiyin.spring02.dao.impl.userDaoMySqlImpl"></bean>
        <!-- autowire自动装配,简化spring配置
             byName根据名称(set方法名后面的)去查找对应的bean,如果有则装配上
         -->
        <bean id="userService" class="com.aiyin.spring02.service.impl.userServiceImpl" autowire="byName">
        </bean>
    
    MicrosoftInternetExplorer4
    0
    2
    DocumentNotSpecified
    7.8 磅
    
    Normal
    
    0
    
    @font-face{font-family:"Times New Roman";}@font-face{font-family:"宋体";}@font-face{font-family:"Calibri";}@font-face{font-family:"Consolas";}@font-face{font-family:"Arial";}p.MsoNormal{mso-style-name:正文;mso-style-parent:"";margin:0pt;margin-bottom:.0001pt;mso-pagination:none;text-align:justify;text-justify:inter-ideograph;font-family:Calibri;mso-fareast-font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;mso-font-kerning:1.0000pt;}span.10{font-family:'Times New Roman';}span.15{font-family:'Times New Roman';color:rgb(0,0,255);text-decoration:underline;text-underline:single;}span.msoIns{mso-style-type:export-only;mso-style-name:"";text-decoration:underline;text-underline:single;color:blue;}span.msoDel{mso-style-type:export-only;mso-style-name:"";text-decoration:line-through;color:red;}@page{mso-page-border-surround-header:no;    mso-page-border-surround-footer:no;}@page Section0{}div.Section0{page:Section0;}
    
    <!--扫描哪些包可以使用注解
    -->
    
    <context:component-scan base-package="com.*" />
    
    xmlns:context=*"http://www.springframework.org/schema/context"**
    *
    xsi:schemaLocation=*http://www.springframework.org/schema/context*
    
    *   **  **http://www.springframework.org/schema/context/spring-context.xsd"**
    *
    @Autowired按类型装配 
    set
    方法可以删除
    
    @Resource 按照名称来装配注入的
    
    @Autowired @Qualifier("userDao") 如果当
    [**spring**](http://lib.csdn.net/base/javaee)上下文中存在不止一个
    UserDao类型的
    bean
    时
    
     
    
    @Component 泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注
    
    @Service 业务层
    
    @Controller 控制层
    
    @Repository 持久层
    

    spring使用完全注解开发时,很方便,前提条件是对基本配置足够掌握

    userDaoMySqlImpl.java
    @Component
    public class userDaoMySqlImpl implements userDao {
        @Override
        public void getUser() {
             System.out.println("Mysql得到数据");
        }
    }
    serServiceImpl.java
    public class userServiceImpl implements userService {
        @Autowired
        private userDao userDao;
        
        @Override
        public void getUser() { 
            userDao.getUser();
        }
    }
    

    @Autowired是根据类型进行自动装配的。如果当spring上下文中存在不止一个UserDao类型的bean时,我们可以使用@Qualifier配合@Autowired来解决这些问题

    userDaoMySqlImpl.java
    @Repository(value ="userDao")
    public class UserDaoImpl implements UserDao {
       @Override
       public void addUser() {
       }
    }
    
    userServiceImpl.java
    @Autowired
       public void setUserDao(@Qualifier("userDao")userDao userDao) {
           this.userDao = userDao;
       }
    

    四:面向切面编程(AOP)

    1、aop:Aspect Oriented Programming面向切面编程
    2、aop在 spring中的作用
    提供声明式服务
    允许用户实现自定义切面

    不改变原有代码,增加新的功能

    传统设计模式

    图片2.png

    3、aop好处
    使得真实角色处理的业务更加纯粹,不再去关注一些公共的事情
    公共业务由代理来完成---实现业务的分工
    公共业务发生改变时,变得更加集中和方便

    4、名词解释
    关注点:增加的某个业务。如日志。安全。缓存。事务等
    切面(Aspect):一个关注点的模块化
    通知(Advice):在切面的某个特定的连接点上执行的动作
    织入(Weaving):把切面连接到其它的应用程序类型或者对象上,并创建一个被通知的对象

    5、使用spring实现aop

    第一种实现方式-----通过springapi来实现

    • Log.java(前置通知)
    public class Log implements MethodBeforeAdvice{
        /**
         * @param method 被调用方法对象
         * @param args 被调用的方法的参数
         * @param target 被调用的方法的目标对象
         * */
        @Override
        public void before(Method method, Object[] args, Object target)
    throws Throwable {
            System.out.println(target.getClass().getName() + "的" + method.getName()
                    + "方法被执行");
        }
    

    Service 层 用户增删改查
    Beans.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"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd 
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd">
        <bean id="userService" class=" com.aiyin.springaop.service.UserServiceImpl"/>
        <bean id="log" class="com.aiyin.springaop.log.Log"/>
        <aop:config>
            <aop:pointcut expression="execution(* com.aiyin.springaop.*.*.*(..))"   id="pointcut"/>
            <aop:advisor advice-ref="log" pointcut-ref="pointcut"/>
        </aop:config>
    </beans>
    
    • 后置通知
    public class AfterLog implements AfterReturningAdvice{
        /**
         * 目标方法执行后执行的通知
         * returnValue--返回值
         * method 被调用的方法对象
         * args 被调用的方法对象的参数
         * target 被调用的方法对象的目标对象
         * */
        @Override
        public void afterReturning(Object returnValue, Method method,
                Object[] args, Object target) throws Throwable {
            System.out.println(target.getClass().getName()+"的"+method.getName()+"被成功执行,返回值是:"+returnValue);
        }
    

    Aop的重要性:很重要
    Spring aop就是将公共的业务(如日志,安全等)和领域业务结合。当执行领域业务时将会把公共业务加进来。其本质就是动态代理

    第二种方式实现aop:自定义类来实现

    Log.java
    public class Log {
        public void before() {
            System.out.println("-------方法执行前---------");
        }
        public void after() {
            System.out.println("-------方法执行后----------");
        }
    }
    
    Beans.xml
    <bean id="userService" class=" com.aiyin.springaop.service.UserServiceImpl"/>
        <bean id="log" class="com.aiyin.springaop.log.Log"/>
        <aop:config>
          <aop:aspect ref="log">
             <aop:pointcut expression="execution(* com.aiyin.springaop.service.*.*(..))" id="pointcut"/>
             <aop:before method="before" pointcut-ref="pointcut"/>
             <aop:after-returning method="after" pointcut-ref="pointcut"/>
          </aop:aspect>
        </aop:config> 
    

    第三种 通过注解来实现

    Log.java
    @Aspect
    @Component
    public class Log {
        @Before("execution(* com.aiyin.springaop.service.*.*(..))")
        public void before() {
            System.out.println("-------方法执行前---------");
        }
        @After("execution(* com.aiyin.springaop.service.*.*(..))")
        public void after() {
            System.out.println("-------方法执行后----------");
        }
        @Around("execution(* com.aiyin.springaop.service.*.*(..))")
        public Object around(ProceedingJoinPoint pjp) throws Throwable {
            System.out.println("环绕前");
            System.out.println("签名:"+pjp.getSignature());
            // 执行目标方法
            Object result =pjp.proceed();
            System.out.println("环绕后");
            return result;
        }
    UserServiceImpl.java
    @Service("userService")
    public class UserServiceImpl implements UserService {
        @Override
        public void add(int a) {
            System.out.println("增加用户");
        }
        @Override
        public void update() {
            System.out.println("修改用户");
        }
       .................
    beans.xml
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd 
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
       <context:component-scan base-package="com.*" />
        <aop:aspectj-autoproxy />
    

    相关文章

      网友评论

          本文标题:Spring入门

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