ssh之spring从原理到使用详解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38016931/article/details/80954722

~Spring概念

1.spring是开源的轻量级框架,即要使用spring时只需导入相应的jar包,而不用以来其他东西。

2.spring的核心两个主要部分:

(1)aop:面向对切面编程,扩展功能而不用修改代码!

(2)IOC:控制反转。举个栗子

        比如有一个类,在类里面有个方法有一个实现某功能方法(非静态),我们要使用这个方法就必须要new一个对象,

        而使用spring,我们就把实例化一个对象交给spring的配置文件来做,通过以来注入方式来注入这个对象。

3.spring是个一站式编程框架,在j2ee的三层结构中都有作用:

    (1) web层:springMVC

    (2)service层:spring的ioc

    (3)dao(即 data access object数据访问对象)层:spring的jdbcTemplate

4.现在使用的版本

    hibernate5.x

    spring4.x

~Spring的ioc操作

1.就是把对象的实例化交给spring处理

2.ioc操作的两部分:(1)ioc配置文件的方式  (2)ioc的注解方法

~ioc的底层原理

1.底层原理使用技术

    (1)xml配置文件

    (2)dom4j解决xml

    (3)工厂模式(高内聚低耦合思想:在一个类里面要精密相连,类与类之间要很少关联,不然一个改变就得改变很多)

            spring在程序中大大实现了解耦合,在spring前,人们可以用工厂模式进行解耦合操作 。

            

            可以看出工厂模式还是让使用的类与工厂类耦合了

    (4)反射

2.下面详细介绍下ioc是怎么运用到这四个技术的,用张图介绍:

~IOC入门案例

第一步 导入jar包

            多的不说,intellij自动导入,具体看视频-NO.5-(日志类必须,我深深的被坑了!)

第二步 创建类,创建类方法

            

第三部 创建spring配置文件,配置创建类

    (1)spring的配置文件位置是不固定

            的建议放在src下面, 名称没有要求,官方建议appliactionContext.xml

    (2)引入scheme约束(找约束-NO.6-)

    (3)配置对象

第四步 测试创建类

        

~Spring的bean管理(xml方式)

bean实例化的方式

1.在spring里面配置文件创建对象

2.bean实例化三种方式的实现

    (1)使用类的无参构造构造对象(这是重点,javabean类中必须要有无参构造函数,不然报错)

        

    (2)使用静态工厂方式

                工厂类中有个静态方法返回类对象

                创建一个静态工厂类

                

                配置bean

                

                factory-method=“”即表示的是工厂类中返回对象的方法名

                然后同样的方式就可获得bean对象

    (3)使用实例工厂创建

                返回对象的方法不是静态的

                配置成这样,获取的java代码一样!

                

                这个更麻烦了知道就可以!

~上面介绍了三种获取javabean的方法,下面讲讲bean标签创建的属性

bean标签常用属性

(1)id属性,即取名字,代码根据id值获取创建的对象

(2)name属性,和id属性值作用一样 id属性值不能包含特殊符号,但这个可以,现在不用了!

(3)class属性,创建对象所在类的全路径

(4)scope属性,表示bean的作用范围,这个有多个属性值

         

        主要用和掌握前两个,不谢的话默认是单例对象(第一个)    (具体了解-NO.10-)

~属性注入

 1.创建对象时,想其属性注入相应的值

2.属性注入三种方式(前两种较常用)

    (1)setter方法注入    (2)有参数的构造注入    (3)使用接口注入

       java代码中的属性注入

      

        spring属性值注入只支持前两种

        

        用的最多的是setter注入

        

 3.注入对象属性(重点)

     在日常的编程过程中,不可能是光是使用spring的功能去注入string等简单类型属性,多的还是注入对象属性类型,在j2ee代码中,多是通过service来控制dao的使用,即service中通常会有一个或多个Dao属性对象。

    在xml配置文件中配置差不多是这样的:

4.p名称空间注入

    看视频吧(-NO.15-)

5.注入复杂类型属性

    (1)数组

    

    (2)list集合(和数组很类似啊)

    

    (3)map集合

    

    (4)properities类型

    

~IOC和DI的区别

1.IOC:控制反转,把对象交给spring进行配置

2.DI:依赖注入,向类里面的属性设置值

3.关系:依赖注入不能单独存在,需要在ioc的基础上完成操作

~spring整合web项目原理(好像很重要  -NO.17-)

1.实现思想

要使用spring时,进行操作时鼻血要new一个ApplicationContext对象来加载配置文件,然后才可以根据这个配置文件来进行对象的创建

然而这个操作效率非常的低,程序性能就会很低。所以就可以将这个对象的new过程放在服务器开启的时候完成,和session的加载差不多!

2.实现原理

(1)将对象放入ServletContext

(2)监听器原理

(3)具体使用

    现在服务器启动的时候,为每个项目创建一个ServletContext对象

    在Servlet创建的时候,使用监听器可以具体到ServletContext对象什么时候创建

    ●在监听到ServletContext创建的时候加载spring配置文件,把配置文件配置对象创建出来

    把穿件出来的对象放到ServletContext域中(setAttribute方法!)

    ●取的时候,到ServletContext域中取(getAttribute方法!)

(4)具体配置过程放后面讲,先说些别的

~Spring的bean管理(注解)

    1.注解

        .代码里面特殊的标记,使用注解可以完成部分功能

        .注解的写法@注解名称(属性名=属性值)

        .注解使用可以放在类、方法、属性上面

    2.spring的注解开发准备

        (1)导入jar包

                ●导入最基本jar包

                

                ●以及spring-aop包(注解用)

                

        (2)创建类创建方法

                ●略

        (3)创建spring配置文件,引入约束

                ●具体过程可以看视频(-NO.19-),intellij好像会自动配置

                ●引入约束后不需要再写<bean>了,只需开启注解扫描,添加

            <context:componet_scan back-package=""><context:componet_scan>          

                   然后会扫描back-package属性所指定的包,根据扫描到的注解实现相应的功能操作

        

            <context:annotation-config></context:annotation-config>

                    如果只添加这句的话就只扫描属性上面的注解,所以还是用上上面那条比较方便!

        (4)用注解方式创建对象

                ●在创建对象的类上面使用注解实现

                    

                ●创建对象还有另外三个注解

                    ○@Controller :web层

                    ○@Service       : 业务层

                    ○@Repositiry : 持久层

                    它们功能都是一样的,比较推荐的就是各层的类用各层相应的注解

                    最好记住两个 Service Conponent

                    ●创建对象时标明是单实例还是多实例的方式

                       只需在类上面添加一条@Scope(value="prototype")或者单例singleton

           (5)然后就像有配置bean时使用方法一样了。

~注解方式注入属性

    1.创建service类,再创建一个Dao类,然后在service类里面得到Dao的对象

        

        

         @Autowired(value=“”)表示的是自动装配,bean中用的是value 

            用autowired时好像Dao类中的@Conponent没有用,因为后台是通过属性类型找到相应的类名然后创建的,和            @Component中的value没有关系,乱写都可以

            

        这个也行,就相当于前面说的用name标识bean时用的name属性,这时候就关上面说的value的事了。

~配置文件和注解方式的混合使用

    (以为单纯使用注解方式才是最完美的,但注解的太分散,这样可读性很差,混合使用就能结合两个的优点)

    使用诸如配置文件中配置对象,用注解方式注入属性。     

~~AOP概念

    1.Aspect Oriented Programing面向切面编程,扩展一个方法的功能不用修改代码的实现。

    2.AOP采取横向抽取机制,取代了传统的纵向集成体系重复性代码

        

~~AOP原理

    画图分析原理:

    

    横向抽取机制 有接口

       

        没有接口

        

~~AOP操作术语     

         

          比如将一个类中的add方法扩展个写日志功能,将log()放在add后,那么这个add就是切入点,log就是切面, 放在add后就是通知!

~~Spring的aop操作(配置实现)

//学期结束,时间也变得充裕,现在要跟着打代码了!

1.首先我们先创建两个类,一个增强类,一个切入点类

 package cn.calculater;

public class Logger {

    public void beforeAdd() {
        System.out.println("这是Calculater类中的add方法的前置增强方法!");
    }

}
package cn.calculater;

public class Calculater {
    public void add() {
        System.out.println("这是add方法!");
    }
}

2.在配置文件中完成类对象的配置

<!--1.配置aop使用的对象-->
    <bean id="calculater" class="cn.calculater.Calculater"/>
    <bean id="logger" class="cn.calculater.Logger"/>

3.在配置文件中配置切面

<!--2.配置aop操作-->
    <aop:config>
        
        <!--2.1配置aop切入点-->
        <aop:pointcut id="pointcut1" expression="execution(* cn.calculater.Calculater.add(..))"/>
        
        <!--2.2配置切面
        把增强放在方法上面
        -->
        <aop:aspect ref="logger">
            <!--method=""表示增强类那个方法作为前置-->
            <aop:before method="beforeAdd" pointcut-ref="pointcut1"/>
        </aop:aspect>
        
    </aop:config>

expression使用的是表达式配置切入点,基本格式是:

execution(<访问修饰符>  <返回类型><方法名><参数><异常>)

几种写法:

(1)execution(*   cn.calculater.calculater.add(..))表示是cn.calculater.calculater类中的所有add方法!

(2)execution(*   cn.calculter.calculater.*(..))表示是cn.calculater.calculater类中的所有方法!

(3)execution(*   *.*(..))表示是所有类的所有的方法!

4.最后我们来看看实现的效果!

好吧报错,好像要写aspectj很麻烦诶,看到有些博客都要配置环境变量,后面要用的话在完善吧!这里真没力气了解这个了,都不一定用得上!要看的话就看(--NO.29-NO.30--)    

~~log4j的相关介绍

1.通过logj能看到程序运行过程中看到更加详细的信息

(1)经常使用log4j查看日志 

2.使用

(1)导入log4j的jar包

(2)复制log4j的配置文件到src包里面

(3)找到log4j.properties,然后就把它放在src目录下面! 就行

据图看(--NO.31--)

~~Spring整合web项目

1.演示之前方法出现的问题:

    (1)jsp 调用service, service调用数据库操作类dao。

            在jsp中调用service和在service中调用dao类都使用spring属性注入方式!

           创建dao类:

package cn.dao;


public class UserDao {
    public void add() {
        System.out.println("add ................");
    }
}

            创建service,有一个dao类对象作为属性(获取userDao对象还是用的老方法:ApplicationContext applicationContext = new                      ClassPathXmlApplicationContext("applicationContext.xml");):

package cn.service;

import cn.dao.UserDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class UserService {

    private UserDao userDao;

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    public void userSer() {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        userDao = (UserDao) applicationContext.getBean("userDao");
        userDao.add();
        System.out.println("userSer ..........");
    }

}

         在index.jsp文件中加入代码:

<%
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
    UserService  user = (UserService) applicationContext.getBean("userService");
    user.userSer();
%>

       applicationContext.xml文件:

        <bean id="userDao" class="cn.dao.UserDao">
        </bean>
        <bean id="userService" class="cn.service.UserService">
            <property name="userDao" ref="userDao"/>
        </bean>

运行显示效果

可以看出每次获取 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");都要加载application.xml文件。

而每次刷新,都要获取一遍

这使得程序运行效率大大降低!

2.解决方案:

    (1)我们可以将applicationContext.xml文件的加载过程放在和tomcat服务器启动的时候一起!

   (2)原理:tomcat程序启动时会给程序初始化一个servletContext对象,我们可以使用监听器监听servletContext的初始化,使得在ServletContext被创建即tomcat启动时实例化一个spring容器,将所有配置了的bean都放进ServletContext中,我们获取bean时从servletContext中获取即可!监听器不需要我们自己写,spring-web包中给我们封装了这些功能!

    (3)具体操作:

           首先在web.xml文件中配置listener

  <!--配置监听器-->
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

        配置applicationContext.xml文件所在的位置(我是放在src目录文件下,所以是classpath:...):

  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
  </context-param>

      配置文件完成了,我们怎么获得这些bean呢?方法有很多,写下我个人觉得比较好的方法:

      创建一个类实现ApplicationContextAware接口

package cn.utils;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

public class WebApplicationContextUtil implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        WebApplicationContextUtil.applicationContext = applicationContext;
    }

    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    @SuppressWarnings("unchecked")
    public static <T> T getBean(String name) throws BeansException {
        return (T) applicationContext.getBean(name);
    }

}

最后在applicationContext.xml文件中添加:

        <!--Spring容器会检测容器中的所有Bean,如果发现某个Bean实现了ApplicationContextAware接
        口,Spring容器会在创建该Bean之后,自动调用该Bean的setApplicationContextAware()方法,
        调用该方法时,会将容器本身作为参数传给该方法——该方法中的实现部分将Spring传入的参数(
        容器本身)赋给该类对象的applicationContext实例变量,因此接下来可以通过该                
        applicationContext实例变量来访问容器本身。-->
        <bean id="webApplicationContext" class="cn.utils.WebApplicationContextUtil">
        </bean>

获得bean时直接使用这个类的静态方法getBean即可:

    UserService  user = WebApplicationContextUtil.getBean("userService");
    user.userSer();


    userDao = WebApplicationContextUtil.getBean("userDao");
    userDao.add();

重启服务器(刷新多次都只是实例化spring容器一次):

~~基于aspectJ的注解aop

一时半会儿还用不上,等用得上时再学再写。。。

~~jdbc Template实现增删改查操作

1.spring框架是一站式框架

    (1)针对Javaee三成,每一层都有解决技术。

    (2)在dao层,使用的是jdbcTemplate

2.spring对不同的持久化技术都进行了封装。

3.增加

    (1)导入相关jar包(或者添加相关依赖)

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-tx</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>${spring.version}</version>
    </dependency>

    别忘了数据库驱动的jar包

  

    <!--mysql数据库驱动 -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.38</version>
    </dependency>

     (2)写个测试类测试jdbc模板操作

    (3)创建jdbcTemplate对象,设置数据源。

...这个写不下去了,,,发了就遛

     

猜你喜欢

转载自blog.csdn.net/qq_38016931/article/details/80954722