Spring基础内容

来源:互联网 发布:上海狮翼网络 编辑:程序博客网 时间:2024/06/03 18:01

1.Spring是什么?


       Spring就是用来解决对象的创建和对象之间的依赖关系的 这样一门技术


    Spring能干什么?

        1>:创建对象
        2>:依赖关系
        3>:为service提供事务
        4>:整合我们的传统开发框架

 

2.事务:

    1>:粗粒度事务

         只能够对方法进行添加事务 这种称为粗粒度事务(Spring的事务只能够是粗粒度的事务

          以后我们在给访问数据库添加事务的时候是不会将事务写到dao层上的,  因为一个动作是否完成取决于业务逻辑是否完成 ,所以事物都是添加在service上的

   2>:细粒度事务

         就是一个事务能够对我们的程序的某几行提供的事务

   3>:事务的分类

      1>:本地事务

       就是只是对一个数据库添加的事务,   我们目前学习的都叫本地的事物

      2>:全局事务

       举例:银行转账 --中国银行给建设银行转钱 。  这个是两个不同的数据库 ,要同时保证在这两 个表中的操作能够顺利的进行,就必须要使用全局事务

3.Spring的模块图(7个

 

1.Spring AOP模块

     AOP:面向切面的编程

              就是将重复代码抽取出来形成切面类 ,然后当我们程序运行的时候,通过 动态代理或者cglib代理来完成代码的自动植入 的这样一个编程思想 就叫做面向切面的编程

2.Spring ORM模块

      主要是提供了对Hibernate/MyBatis/JDO其他ORM框架整合的支持(对象关系映射)

3.Spring DAO模块

     这个模块实际上是 Spring提供的一个dao层的解决方案(dbutils这种)


4.Spring WEB模块

     这个是Spring提供的对web的支持


5.Spring Context模块

      Spring提供的一个对上下文的支持


6.Spring WEB MVC模块

      这个模块实际上就是传说中的 Spring MVC


7.Spring Core模块


      在我们的Spring中提供了两个思想:  IOC  / DI

   

        IOC----->表示的是控制反转(inversion  of  control)

        DI ----->依赖注入 (dependcy  injecte)

     反转的是什么?

         1>:以前我们在使用MVC模式来进行开发的时候 service对象是谁创建的?dao对象是谁创建的? 以前我们要使用这个任意类的对象 --->自己通过程序去new一个

         2>:学习了IOC之后那么以后我们的对象的创建就不是我们去完成了,而是由Spring的IOC容器去完成

               那么反转的是什么? 反转的是创建对象的这个权利-----------以前我们自己创建,现在Spring的IOC容器去给我们创建;

               具体控制的是什么? 控制的是创建对象。

 


       依赖注入:注入的是什么?

        依赖表示的是什么意思?谁依赖谁?

        谁依赖谁? 最经典的:controll依赖于service ,service依赖于dao

        依赖注入? 注入的是什么? 注入的是 对象 还有 普通的资源(字符串/boolean/int/float/double)

        控制反转和依赖注入的核心功能包就是:Spring core模块完成的功能

 

4.使用Spring编写一个HelloWorld程序

      1>: 编写程序的第一步:百度下载jar包   spring-framework-4.3.7.RELEASE-dist.jar

      2>:在工程中导入这个包

         commons-logging-1.1.3.jar --->依赖包 日志相关包,是用来辅助运行的

         spring-beans-4.3.7.RELEASE.jar --->实体生成对象的包

         spring-context-4.3.7.RELEASE.jar --->上下文相关包

         spring-core-4.3.7.RELEASE.jar --->核心功能包

         spring-expression-4.3.7.RELEASE.jar --->表达式相关的包


      3>:在我们的src目录下 新建一个文件这个文件的名字是 ApplicationContext.xml这个文件(名字呢实际上是可以随便写)/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"xmlns:p="http://www.springframework.org/schema/p"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd">
<!--自动生成对象-->
<bean class="com.qf.helloword.User"></bean>

</beans>

 

      4>:配置我们约束

         在我们的下载包里面去找spring的配置文件 打开htmlsingle -->xmlns:p 找个长的 copy过来将bean中的所有的东西删除

      5>:使用API获取这个对象

        第一种模式

public void test() throws Exception {//有两种模式来获取这个JAVA对象//第一种 通过工厂模式来获取JAVA对象//框架默认的路径就在src下ClassPathResource resource=new ClassPathResource("bean.xml");//获取这个工厂XmlBeanFactory factory=new XmlBeanFactory(resource);//第三步:获取这个JAVA对象User user=(User) factory.getBean("user_01");System.out.println(user);}

       第二种模式

public void test2() throws Exception {ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("bean.xml");//第三步:获取这个JAVA对象User user=(User) context.getBean("user_01");System.out.println(user);}

5.Spring的IOC/DI配置文件

   现在这个对象默认是没有构造函数/没有说明到底是单例的与否....

     1>:默认情况下 生成的JAVA对象是单例的

        配置

       自动生成对象:
       scope="prototype":这个就表示的是多例
       scope="singleton":这个表示的是单例
       lazy-init:表示的是是否延迟创建对象 ,这个只是对单例有效  ,如果不延迟创建那么在web工程中启动工程就会自动创建 ,如果延迟那么表示的是使用的时候才创建对象
        destroy-method="destoryBobo":销毁方法

       init-method="initBobo":初始化方法


       <bean class="com.qf.helloword.User"scope="singleton" lazy-init="false" init-method="initBobo" destroy-method="destoryBobo"></bean>


        假设我想给我们的对象赋值 怎么办?

       调用有参数的构造器<bean  class="com.qf.helloword.User"><!--这个表示调用的是有多个参数的构造器
index:表示的是参数的下标 value代表的是这个值--><!-- <constructor-arg index="0" value="中国"></constructor-arg><constructor-arg index="1" value="美国"></constructor-arg> --><!-- <constructor-arg name="userName" value="西瓜瓜"></constructor-arg><constructor-arg name="userPassword" value="123"></constructor-arg> --></bean>


        下面引用字符串:

<!--假设我要在容器中放入 字符串的对象可不可以直接赋值呢?--><bean  class="java.lang.String"><constructor-arg index="0" value="我是名字"></constructor-arg></bean><bean  class="java.lang.String"><constructor-arg index="0" value="我是密码"></constructor-arg></bean><bean  class="com.qf.helloword.User"><constructor-arg index="0" ref="userName"></constructor-arg><constructor-arg index="1" ref="userPassword"></constructor-arg></bean>

         工厂的模式来创建对象

<!--静态的方法生成我们的对象--><!--非静态的方法来生成对象--><bean  class="com.qf.helloword.UserFactory"></bean><!--省传入那个工厂里面指定方法的对象--><bean  factory-bean="factory" factory-method="getUserByNOStaticFacory"></bean><!--通过静态的方法来生成对象--><bean  class="com.qf.helloword.UserFactory" factory-method="getUserByStaticFacory"></bean> 接下来我们研究下获取对象的APIClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("bean.xml");//第三步:获取这个JAVA对象//如果使用了类型来找这个对象的话那么 在IOC容器里面就只能有一个类型的对象才能找到//User user=(User) context.getBean(User.class);//通过名字来找 最稳定的//User user=(User) context.getBean("user_01");//System.out.println(user);注意:使用Spring的时候 默认调用的是无参数的构造参数

 

  

DI的配置

set 方法进行注入

1>:在需要对象的地方申明我们的类的成员变量

//Set注入的第一步:申明成员变量private UserDao userDao=null;//第二步:为成员变量生成set方法public void setUserDao(UserDao userDao) {this.userDao = userDao;}//第三步:在我们的bean.xml中进行如下配置<!--配置dao--><bean  class="com.qf.di.UserDao"></bean><!--配置Service--><bean  class="com.qf.di.UserService"><!--ref表示要引用我们ioc容器里面的资源--><property name="userDao" ref="userDao"></property></bean>

  

p标签进行注入
1>:在需要对象的地方申明我们的类的成员变量

//Set注入的第一步:申明成员变量private UserDao userDao=null;//第二步:为成员变量生成set方法public void setUserDao(UserDao userDao) {this.userDao = userDao;}<!--p标签注入--><bean  class="com.qf.di.UserService" p:userDao-ref="userDao"></bean>内部bean的形式进行注入(基本不用)<!--内部bean--><bean  class="com.qf.di.UserService"><property name="userDao"><bean class="com.qf.di.UserDao"></bean></property></bean>自动装配<!--自动装配--><bean  class="com.qf.di.UserDao"></bean><!--name是通过名字找--><!-- <bean  class="com.qf.di.UserService" autowire="byName"></bean> --><!--通过类型找 那么在IOC的 容器中只能有一个对象 有多个的话那么会报错--><bean  class="com.qf.di.UserService" autowire="byType"></bean>还可以设置全局的自动装配


注解模式的使用

1>:配置扫描器

<context:component-scan base-package="com.qf.anotation"></context:component-scan>

2>将对象放置到IOC容器呢?

@Component @Service @Repository

3>:注对象

@Resource @Autowired

 

注意: 在业务逻辑层也可以使用 @Service

              在dao层也可以使用 @Repository

 

 

2017-09-13  01:25:06