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());
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容