JAVA_EE_Spring学习一

简介:

  可以认为spring是一个容器(container)

  • 包含内容:
    • Ioc/DI 控制反转/依赖注入
    • AOP 面向切面编程
    • 声明事务。


      Runtime
  • test:spring提供的测试功能。
  • core container:核心容器。spring启动最基本的条件。
    • spring中最大的容器是,applicationContext。
    • Beans:负责创建并管理对象的。
    • Core:核心类库。
    • Context:上下文参数,获取外部资源或者管理注解。
    • SpEl:expression.jar
  • Date Access/Integration:封装数据访问层相关内容
  • Web:完成web相关功能是需要。

一、Spring环境搭建

  1. 导包,除了上面所说的启动基本条件的包外,还有一个日志打印的包。
jar
  1. 在src下新建applicationContext.xml文件
  • Spring 容器ApplicationContext,xml文件配置的信息最终都存储到了ApplicationContext容器中。
  • spring配置文件:基于schema。语法检查器。
    • schema文件扩展名.xsd
    • 把schema理解成DTD 的升级版。比DTD具备更好的扩展性,
    • 通过bean标签来创建对象。
    • 默认是配置文件被加载时候就创建对象
<?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">
<!-- 
    id:获取到的对象标识
    class:创建哪个类的对象
 -->
    <bean id="peo" class="com.qdl.pojo.People" />
</beans>
  1. 编写测试方法。
  • getBean("id值",“返回值类型”)。不写返回值类型默认是object
  • getBeanDefinitionNames,获取spring所管理的所有对象名字。
//配置文件一加载 类就会创建,而且会去寻找无参构造方法。
        ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
        People people = ac.getBean("peo",People.class);
        System.out.println(people);
        //获取spring所管理的对象名字
        String[] names = ac.getBeanDefinitionNames();

二、创建对象的三种方式(IoC)

IoC-控制反转
  • 是什么?
    • 原来有程序员主动new实例化对象的事情,转交给spring负责
    • 控制:控制类的对象。
    • 发转:转交给spring负责。
  • 优点:解耦,程序员不需要管理对象了,解除了对象管理和程序员之间的耦合。
1. 通过构造方法创建
  • 无参构造创建:默认创建
  • 有参构造创建:需要明确配置
<bean id="peo" class="com.qdl.pojo.People">
        
            ref 是引用另一个bean,value是基本数据类型或string类型 
            index:指代的是有参构造器中的第几个参数,
            name:指代的是有参构造器中参数的名字
            type:指代参数的类型。
        <constructor-arg index="0" value="1"></constructor-arg>
        <constructor-arg index="1" value="张三"></constructor-arg>
        <constructor-arg index="2" value="23"></constructor-arg>
    </bean>
2. 实例工厂
  • 工厂设计模式:帮助创建类对象,一个工厂可以生产多个对象。
  1. 创建实例工厂
public class PeopleFactory {

    public People newInstance() {
        return new People(2,"秦得力",23);
    }
}
  1. 在xml文件中配置工厂对象和需要创建的对象。
<bean id="factory" class="com.qdl.pojo.PeopleFactory"></bean>
    <bean id="peo1" factory-bean="factory" factory-method="newInstance"></bean>
3. 静态工厂
  1. 创建工厂的静态方法。
  2. 在xml文件中配置 bean如下,指定其中的工厂方法即可。
<bean id="peo2" class="com.qdl.pojo.PeopleFactory" factory-method="newInstance"></bean>

三、给bean对象参数赋值

1、通过构造方法,在创建类的时候赋初始值。
2、设置注入(通过set方法)
  • 设置注入就是走的类的get和set方法。
  1. 如果是基本数据类型或者string 类型则使用下面的方法。
  • 其中的value标签可以写道property标签中间。
<bean id="peo" class="com.qdl.pojo.People">
        <property name="id" value="1"></property>
        <property name="name" value="秦得力"></property>
        <property name="age" value="23"></property>
    </bean>
  1. 如果是参数类型是set
<property name="sets">
            <set>
                <value>1</value>
                <value>2</value>
                <value>3</value>
            </set>
        </property>
  1. 参数类型是list
  • 方法同上,
  • 但是如果list中只有一个值,可以使用下面的方法:
    <property name="list" value="1"></property>
  1. 参数类型是数组类型(array)
  • 方法同上,
  • 如果数组中只有一个值,同样可以同上。
  1. 参数是map
<property name="maps">
            <map>
                <entry key="1" value="1"></entry>
                <entry key="2" value="2"></entry>
                <entry key="3" value="3"></entry>
            </map>
        </property>
  1. 参数是properties
<property name="demo">
            <props>
                <prop key="1">value</prop>
            </props>
        </property>

四、DI/依赖注入

  • 和IoC是一样的,只不过是在其中一个对象中传入另一个对象的参数
  • 上面一段是people类,中间传入参数desk类的一个对象,使用DI注入。
    <bean id="peo" class="com.qdl.pojo.People">
            <property name="desk" ref="desk"></property>
    </bean>
-----------------------------------------------------------------
    <bean id="desk" class="com.qdl.pojo.Desk">
        <property name="id" value="1"></property>
        <property name="price" value="100"></property>
    </bean>

五、使用spring简化mybatis

1、导包
  • mybatis所有的包、spring基本包、spring-jdbc、spring-tx、spring-aop、spring整合mybatis的包。
2、配置xml文件
-- 数据源封装类:获取数据库连接的类
    1、导包:JDBC的spring支持包,mybatis的包、
 -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property>
        <property name="url" value="jdbc:mysql://localhost:3306/ssm?useSSL=false &amp; serverTimezone=UTC"></property>
        <property name="username" value="root"></property>
        <property name="password" value="qinyu888"></property>
    </bean>
    -- 回忆前面我们写mybatis的时候,在opensession之前加载的mybatis.xml
    因此,这里需要为其添加datasource。
     -->
     -- 创建sqlSessionFactory对象 -->
    <bean id="factory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
    -- 扫描器,相当于mybatis.xml中的mappers下的package标签,扫描mapper后,会给对应接口创建对象 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        -- 要扫描哪个包 -->
        <property name="basePackage" value="com.qdl.mapper"></property>
        -- 和factory产生关系 -->
        <property name="sqlSessionFactory" ref="factory"></property>
    </bean>
    -- 这里的ref中为什么要这样写,是因为spring会自动把mpper的类名这样命名 -->
    <bean id="peopleService" class="com.qdl.service.impl.PeopleServiceImpl">
        <property name="peopleMapper" ref="peopleMapper"></property>
    </bean>
3、编写代码
  1. 编写pojo
  2. 编写mapper包下时,必须使用接口绑定方案或注解方案(必须有接口)因为再service的实现层中,必须要创建接口对象。不然没办法创建
  3. 再sevice实现类中声明Mapper接口对象,并生成get和set方法。(为了让spring来代理)
  • spring无法管理servlet
public class PeopleServiceImpl implements PeopleService {
    private PeopleMapper peopleMapper=null;
    public PeopleMapper getPeopleMapper() {
        return peopleMapper;
    }
    public void setPeopleMapper(PeopleMapper peopleMapper) {
        this.peopleMapper = peopleMapper;
    }
    public List<People> show() {
        return peopleMapper.selAll();
    }
}

4. 编写servlet层代码,流程如下所示

  • 两种方式加载配置文件:
    • 使用tomcat手动加载配置文件。
    • 使用tomcat自动加载配置文件需要步骤如下:
  1. 导包:spring-web
  2. 编写web.xml配置文件,让tomcat自动去加载
<!-- 上下文参数 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <!-- spring配置文件 -->
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>
    
    <!-- 封装了一个监听器,帮助加载spring的配置文件 -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
  1. 书写servlet代码
  • 上面注释的的手动加载,下面的是让tomcat管理,加载好我们拿出来用。
//@WebServlet("/people")
public class PeopleServlet extends HttpServlet {
    private PeopleService peopleService;
    
    @Override
    public void init() throws ServletException {
        //下面这一条代码是我们设置tomcat去加载配置文件
        //ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
        // spring和web整合后的所有信息都存放再webApplicationContext中 
        //下面这段代码可以让tomcat启动的时候自动加载配置文件。
        WebApplicationContext ac = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());    
        peopleService = ac.getBean("peopleService",PeopleServiceImpl.class);
    }
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    List<People> show = peopleService.show();
    PrintWriter out=resp.getWriter();
    out.write(show.toString());
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,902评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,037评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,978评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,867评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,763评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,104评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,565评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,236评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,379评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,313评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,363评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,034评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,637评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,719评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,952评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,371评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,948评论 2 341

推荐阅读更多精彩内容