Spring, SSM的学习(黑马)

Spring, SSM的学习(黑马),第1张

Spring, SSM的学习(黑马) 1.Spring简介

 Spring的架构

创建一个module,先把core里的Jar包导入。

然后在结构里点+,选中jar包导入。

 

2 Spring入门

 通过bean标签创造对象

测试一下

@Test
public void testAdd() {
 //1 加载 spring 配置文件
 ApplicationContext context =
 new ClassPathXmlApplicationContext("bean1.xml");
 //2 获取配置创建的对象
 User user = context.getBean("user", User.class);
 System.out.println(user);
 user.add();
}

2.1 开发步骤

 

 

 resource下面创建配置文件。

3 Spring配置文件详解

3.1 bean标签

 id是getBean获取的索引。得有无参构造器。

 3.2 bean标签范围配置

 3.2.1测试singleton和prototype

scope设为singleton

下图创建的这俩对象,一样。

 上了prototype,

这里输出的就不是同一个对象。

3.3 singleton和prototype的区别

创建对象时间不同:

singleton创建的对象,没用构造器,在配置文件加载的时候就创建。

prototype创建的对象,用空参构造器,在getBean方法的时候创建对象。

只要bean容器在,singleton的对象就不会销毁。

只要对象在使用中,就一直活着。

3.4 bean的生命周期

 

 然后在bean标签里,指明这两个对应的方法名。

init,对象先创造,然后执行一次初始化方法。

通过这个对象关闭,可以销毁。

3.5 bean实例化的三种方式

 3.5.1静态工厂

先创建一个工厂 

 

下一步告诉Spring,以后用工厂创建对象。

找到Spring的配置文件。

注释原来的。 路径改成工厂路径,然后加一个factory-method,方法,即构造对象的方法。

 

3.5.2 动态工厂

先创建一个工厂对象,然后用工厂对象调用方法,创一个自己的对象。

 

3.6 Bean的依赖注入分析。

因为Service层获取的对象,要调用Dao 层的方法,所以直接将DAO在容器里,设置到Service内部。

所以获得Service实例时,内部已经有了DAO的实例,可以直接调用其save方法。

3.7 Bean依赖注入概念

依赖的关系 让Spring来维护。

那么怎么将依赖注入呢?

 3.7.1 set方法 

1.在Service的实现类,里建了一个DAO的实例。设置set方法。

2.告诉Spring

ref,引用bean标签下id为userDao,然后创建一个实例,传给Service层的Set方法。

在Service内部接受这个实例。

 里面name属性值对应SetUserDao,后面的D小写,userDao。

注释原来web层代码,用new的方式调用,发现空指针异常。即,不能通过这种方式。

这个对象不是从容器拿的。

 3.7.2 set方法 注入(P命名空间)

省了一点字数。 

 3.7.3 构造器构造

ref还是指向bean标签。

name:是在Service里造的对象的名字。

3.8 bean依赖注入的数据类型

 也是set和构造两种方式。

3.8.1 注入普通数据类型

演示用set,演示如下:

1.先设好属性和set方法。

 2.告诉spring

3.8.2 注入集合数据(MAP,List,Properties)

用set演示。

 1.String类型的List,用value标签里面放值,是字符串。

 2.Map的value,那里是一个引用。User的对象内部也有属性值。也可以注入。

然后在Service的bean标签里,这样就注入了Map的对象。

3.注入properties数据

4.测试结果,用了toString。

3.9 引入其他配置文件(分模块)开发。

 

 拆解成很多别的模块。看需求。

可以在主配置文件引用其他配置文件。

4.Spring相关API 4.1 applicationContext继承体系。

这里是多态。加载配置文件。

图都胡了,我们用的在最下层的右边。

4.2 applicationContext的实现类。

因为在resource下,可以直接写路径。

4.3 getBean方法 使用(两种方式的区别)

上面一个方法按 id找。

下面一个方法按字节码找。

方法1:传入参数,id

区别:没有要求。按id,找,甚至可以有两个功能一样的容器。

方法2传入参数:

 

 区别:有要求。不能写两个功能一样的容器,不然不知道找哪个用。

5.spring配置数据源

这里的数据源,就是之前学的连接池。

 5.1 数据源开发步骤(非Spring配置)

1.导入坐标


        
            org.springframework
            spring-context
            5.0.5.RELEASE
        

        
            mysql
            mysql-connector-java
            5.1.32
        

        
            c3p0
            c3p0
            0.9.1.2
        
        
            com.alibaba
            druid
            1.1.10
        
    

 2.创建数据源对象

JDBC那章讲过。

 缺点:这些代码里参数,与具体的数据库耦合了。

 这里JDBC那里讲过。

用一个配置文件解耦合。

 

5.2 Spring亲自配置

可以将datasource交给容器配置。

这里要注入的值,是配置数据源时需要set的值。druid和cp03有区别。

下图为cp03,

 class路径怎么找?

 右键,copyReference。

但这种配置方式有还存在缺点,里面的数据又是写死的。

所以我们要学的就是在XML里,加载JDBC.properties文件。

 5.2.1 配置代码



    
    



按照规则传值。

6.Spring注解开发

老子之前配置文件开发用的好好的,又要学注解了。

6.1 Spring原始注解

 6.1.1 Componet Autowired和 Qualifier。入门

需要把DAO对象注入Service对象。然后告诉Spring,生成Service对象。

1.Componet将dao其注入容器。创建它的bean。 

2.Componet将Service其注入容器。将dao注入Service。

用@autowired和@Qualifier。

 3.在Spring里用组件扫描包,解析注解

这里的base-package,基础包,会扫描这个包下和它子包里的所有注解。

 4.然后在controller层,就能通过加载配置文件。用产生的service对象。

如果碰到错误,no such bean,配置文件加一句组件扫描。

6.1.2 注解详细讲解

6.1.1只是写了一个入门帮助理解。在不同层创建bean的时候,还是得这样。

@AUtowired,按照数据类型从Spring容器里按种类找到,适合的bean。但可能适合的有很多,所以用@Qualifier,通过名称精确注入。

resource=这俩一起用。

6.1.3 注入普通数据。@value注解

在application里加载了外部配置文件,可以得到这个文件里的键值对。

用${},读取。

 

 6.1.4 @scope,@postConstructor,@predestroy

在产生容器注解下,声明可以创建几个bean。

在初始化方法上加@postConstructor,因为初始化是在构造器执行后。

销毁当打上加@predestroy,在销毁之前。

 

手动关闭Sping容器,就执行销毁方法。

6.2 Spring新注解

 需要整一个Spring配置类,用这个类可以取代applicationContext这个XML文件。

@configuration,标识这个类是Spring配置类。

@componentScan,spring初始化容器时,需要扫描哪个基础包的注解。

@import,这个总的Spring配置类,可以导入其他分的配置类。

 

比如配置数据源的,分数据类。

@propertySource,加载properties文件。这样就可以通过${},的形式,接受properties文件里的键值对。

 

@Bean,注解括号里的字符串,等于之前bean标签的id。

@Bean注解将方法的返回值存在Spring的容器中。

 

6.3 新注解开发后如何使用?

注解已经代替了applicationContext.xml。

 这个读取配置文件的不能再用。

这句话,替换。

ApplicationContext app=new AnnotationConfigApplicationContext(配置类.class);

 

6.4 Spring总结

可以一个配置文件都不要,完成开发。

7.Spring整合Junit测试 7.1 问题

因为你要测容器产生的对象,所以这两句话总是得有。

如何解决?

 7.2 解决方案

 

7.3 集成Junit步骤

①导入spring集成Junit的坐标、
②使用@Runwith注解替换原来的运行期
③使用ContextConfiguration指定配置文件或配置类
④使用@Autowi red注入需要测试的对象
⑤创建测试方法进行测试

1.导入spring集成Junit的坐标


            org.springframework
            spring-test
            5.0.5.RELEASE
        

2.编写一个测试类,使用@Runwith注解,替换原来的运行器。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")

3.@ContextConfiguration,在测试类上加这两注解。第二个注解,读取Spring容器。

如果是配置文件,这么写,@ContextConfiguration("classpath:applicationContext.xml")

如果是配置类,这么写,

 

4.@autowired,把容器里的对象注入。

 然后在test方法里就可以用这些对象了。

8.Spring与web环境的集成

web层就是专门用Spring容器的。Servlet层。

这里用注解写就行。 

8.1 应用上下文对象的创建

问题:每次都要加载一次配置文件,属实不方便。

我们需要Spring容器被创建一次就行。

 

8.1.1 自定义一个监听器

解决:

整一个监听器,看到web启动,就生成一个上下文对象,把它放在   servletContext域,想用的时候就拿出来。

整个listener包。 

 

ContextLoaderListener

解耦合,需要在web.xml里,加上初始化参数,然后读取里面的路径参数。


    contextConfigLocation
    classpath:applicationContext.xml

ContextLoaderListener.java

public class ContextLoaderListener implements ServletContextListener {

    public void contextInitialized(ServletContextEvent servletContextEvent) {
        ServletContext servletContext = servletContextEvent.getServletContext();
        //读取web.xml中的全局参数
        String contextConfigLocation = servletContext.getInitParameter("contextConfigLocation");
        ApplicationContext app = new ClassPathXmlApplicationContext(contextConfigLocation);
        //将Spring的应用上下文对象存储到ServletContext域中
        servletContext.setAttribute("app",app);
        System.out.println("spring容器创建完毕....");
    }

    public void contextDestroyed(ServletContextEvent servletContextEvent) {

    }
}

这里把app,即上下文对象放进域了,可以专门整一个静态的方法,封装一下。我们调用那个静态的方法就能获得对象。

WebApplicationContextUtils.java

package com.itheima.listener;

import org.springframework.context.ApplicationContext;

import javax.servlet.ServletContext;

public class WebApplicationContextUtils {

    public static ApplicationContext getWebApplicationContext(ServletContext servletContext){
        return (ApplicationContext) servletContext.getAttribute("app");
    }

}

8.1.2 spring提供的监听器

pom里导个包,这里没讲注解就别用注解了。

 

web.xml里配置一下。

 

 

然后在userServlet里,这里没用注解。

public class UserServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
        ServletContext servletContext = this.getServletContext();
        //ApplicationContext app = (ApplicationContext) servletContext.getAttribute("app");
        //ApplicationContext app = WebApplicationContextUtils.getWebApplicationContext(servletContext);
        ApplicationContext app = WebApplicationContextUtils.getWebApplicationContext(servletContext);
        UserService userService = app.getBean(UserService.class);
        userService.save();
    }
}
在web.xml里写一个映射。等于@WebServlet("/userServlet")

 

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5715957.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-18
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存