spring复习-创新互联

Spring

IOC : 使用对象的时候不手动创建,交给spring从外部中提供对象产生

成都创新互联公司是一家集网站建设,城口企业网站建设,城口品牌网站建设,网站定制,城口网站建设报价,网络营销,网络优化,城口网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。

外部 : 外部指的是spring中的IOC容器,用来存放Bean

Bean: 指放在外部需要创建或管理的对象,且在IOC容器中

DI : 依赖注入.在容器中有依赖关系的bean会关联绑定

XML使用
org.springframeworkspring-context5.2.12.RELEASE

刷新之后在resources资源下创建spring配置文件,idea右键xml创建有

注: 需要刷新导入spring-context之后才有

//配置bean   
public static void main(String[] args) {ApplicationContext app = new ClassPathXmlApplicationContext("application.xml");
        bookServiceimpl bookServiceimpl = (com.cdl.service.impl.bookServiceimpl) 			     		       app.getBean("bookServiceimpl");
        bookServiceimpl.save();
    }

使用DI方式解耦service层new对象

首先把new对象的代码删除,保留声明,提供set方法给bean进行绑定

接着修改spring配置文件

name指的是需要绑定的属性名名称,ref表示需要绑定的类型的bean的id,也可以绑定bean的name属性的名称

bean标签的name属性设置的是bean的别名

bean标签的scope属性设置的是单例模式或者非单例模式

​ 默认singleton单例,可选prototype非单例

实例化bean的方式

第一种

​ 构造方法的方式,是通过无参构造方法来进行创建,不管私有还是公共,通过反射

第二种

​ 通过静态工厂的方式,在原先bean下设置class的值为工厂的类路径,然后需要加上factory-method参数加上方法名

第三种

​ 使用实例工厂 的方式,先使用bean通过id和class托管实例,再加一个bean同第二种方式但是不需要class替换成factory-bean指定前面托管实例的工厂bean

第四种

​ 是第三种的改良,通过实现FactoryBean实现方法,第一个方法getObject返回需要构建的new UserDaoImpl第二个返回类型就返回UserDao.class,通过实现isSingleton方法return true 默认true单例

生命周期控制

在bean托管的类种定义init和destory方法,然后在bean标签上增加init-method和destory-method指定方法名,默认bean销毁操作不会执行,需要我们把ApplicationContext类型转换成ClassPathXmlApplicationContext他的实现类然后进行手动.close()暴力关闭.也可以通过.registerShutdownHook()注册钩子函数来告诉虚拟机在关闭之前需要先关闭容器

定义init和destory方法也可以通过实现接口的方式这样就不用添加标签属性,实现InitializingBean和DisposableBean的afterPropertiesSet和destory方法

数据注入

引用类型前面已经使用过,使用ref来指定需要注入的属性的引用类型,且需要生成setting方法

简单类型注入,包括字符串,同样是使用property标签在bean内部,ref是引用类型注入,使用value则是简单类型注入,类型会自动转换

构造器参数注入,用的就不是property了而是constructor-arg标签指定name是形参的名称,如果是引用类型则需要ref引用bean,也可以不使用name来指定,使用index传入参数的位置0

自动装配

在bean种设置autowire参数,指定byType或者byName,指定类型装配就必须要有bean的类型一致的,按照byName的话就必须要属性名称要和id名一致,其实就是和属性的set方法去掉set把第一位变成小写,两种方式都需要生成set方法

集合类型注入

格式

1111

加载读取properties文件

首先需要先开启命名空间

xmlns:context="http://www.springframework.org/schema/context"

http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd

// 读取,读取之后${}来读取里面的数据 ,且不加载系统的属性// 标准格式

容器初始化方式

可添加多个用,分割

ApplicationContext app = new ClassPathXmlApplicationContext("application.xml");

BeanFactory是IOC容器的顶层接口,初始化容器的时候,加载的bean延迟加载

ApplicationContext接口是IOC容器的核心接口,初始化容器的时候bean立即加载

注解开发

首先是需要配置xml扫描注解,先需要导入设置命名空间context

// 通过组件进行扫描

哪个类需要注入成bean就用@Component(“userDao”),可以不指定名称,但是就需要getBean中使用类.class

三个@Component衍生注解

​ @Controller:用于表现层bean定义

​ @Service: 用于业务层bean定义

​ @Repository: 用于数据层bean定义

作用都是一样

spring3.0开启了纯注解开发,可以使用java类来代替xml配置文件

@Configuration //声明为配置类
@ComponentScan("com.cdl") //设定扫描路径,只能一次,多个用数组
public class SpringConfig {}

初始化容器变成AnnotationConfigApplicationContext

指定作为配置文件的类类型

ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);

bean生命周期函数

@PostConstruct //init
@PreDestroy //destroy

注解依赖注入

对属性需要注入的使用@Autowired注解,默认是根据类型注入,有多个就需要在指定bean声明名称就根据相同属性名查找注入

使用@Qualifier(“”)进行指定名称装配

读取properties文件内容

在配置文件类中使用

@PropertySource({"myProperties.properties"})

使用${}进行装配

@Value("${name}")
    private String name;

注解管理第三方bean

比如说druid德鲁伊

直接写入在spring配置类中,定义一个方法返回手动new的配置好的连接对象,给方法加上注解@Bean

单独抽出来写一个德鲁伊配置类,同样是使用@Bean注解定义在一个方法上,说明这是一个bean

然后在spring配置类中加上

@Import(DruidConfig.class)

@Value直接给即可

第三方bean需要用到引用类型,那么就需要传入的引用类型是一个bean然后给方法加上形参,按照类型自动装配

aop

导入坐标

org.aspectjaspectjweaver1.9.4

加上注解,说明用注解开发aop

@EnableAspectJAutoProxy

定义一个aop类,@Component声明bean,@Aspect遇到这个就会按照aop进行操作…代表任意参数

@Component
@Aspect
public class MyAdvice {// 切入位置
    @Pointcut("execution(* com.cdl.dao.UserDao.selectAll(..))")
    public void bd(){}
    public void method(){System.out.println("共有操作");
    }
}

事务

使用@Transactional注解表示开启事务,对方法添加,里面的调用不同的数据层操作加入到同一个事务中,里面不管谁在范围内出错了就都会回滚

SpringMVC

springMVC是Servlet的简化开发

入门案例

创建maven使用webapp骨架创建

导入

javax.servletjavax.servlet-api3.1.0providedorg.springframeworkspring-webmvc5.3.1org.apache.tomcat.maventomcat7-maven-plugin2.280/

定义Controller

package com.cdl.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

// 定义bean
@Controller
public class UserController {// 当前操作访问路径
    @RequestMapping("/save")

    // 设置当前返回值为响应内容
    @ResponseBody
    public String save(){System.out.println("user save...");
        return "{'model':'springmvc'}";
    }
}

定义mvc配置类

package com.cdl.config;


import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration //设置为配置
@ComponentScan("com.cdl.controller") //设置扫描路径
public class SpringMvcConfig {}

定义加载mvc的servlet容器配置类

package com.cdl.config;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;

// servlet容器启动配置类,里面加载mvc配置
public class ServletControllersInitConfig extends AbstractDispatcherServletInitializer {// 加载mvc配置
    @Override
    protected WebApplicationContext createServletApplicationContext() {AnnotationConfigWebApplicationContext applicationContext = new AnnotationConfigWebApplicationContext();
        applicationContext.register(SpringMvcConfig.class);
        return applicationContext;
    }
    // 设置哪些请求被mvc处理
    @Override
    protected String[] getServletMappings() {return new String[]{"/"};
    }
    // 记载spring容器配置
    @Override
    protected WebApplicationContext createRootApplicationContext() {return null;
    }
}

运行配置maven选择toncat7:run

访问http://localhost/save 成功!

bean加载控制排除,排除注解类型Controller的类

@ComponentScan(value = "com.cdl",
    excludeFilters = @ComponentScan.Filter(
            type = FilterType.ANNOTATION,
            classes = Controller.class
    )
)

@RequestMapping(“/save”)加在类上就是整个类的所有方法的请求路径头

加在方法上就是具体路径,如果类上有那么访问方法上的就得加上前缀

get和post请求都是同样的接收

@Controller
public class UserController {// 当前操作访问路径
    @RequestMapping("/save")

    // 设置当前返回值为响应内容
    @ResponseBody
    public String save(String name,int age){System.out.println("user save...");
        return "{'model':'springmvc'}";
    }
}

遇到中文

在ServletControllersInitConfig配置类中重写getServletFilters

使用@RequestParam(“name”)可以指定请求路径方法参数的名称绑定

如果是pojo类为形参,那么对应属性名称相同的会自动传入

如果pojo类里的属性是引用类型,想要给引用类型的属性进行绑定,那么请求参数就引用类型属性名.属性名进行传参

如果形参是数组类型,相同名称的可以传递,不相同的无法传递

如果形参是集合类型比如LIst那么就需要@RequestParam注解在前面

json数据接收

请求体内

在mvc配置文件中加上@EnableWebMvc注解

请求参数注解换成@RequestBody

传递日期数据

传递的是/分隔的字符串那么就可以直接转换成Date格式形参

如果是其他格式的那么就需要使用@DateTimeFormat(pattern=“yyyy-MM-dd”)来进行修饰形参

响应

默认请求return的字符串会去找webapp下的页面响应,加上@ResponseBody注解就会响应的只是字符串

返回pojo数据的话同样加上@ResponseBody注解就会自动转换成json

需要导入这个,用于转换成json

org.fasterxml.jackson.corejackson-databind5.3.1

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


本文题目:spring复习-创新互联
当前链接:http://hbruida.cn/article/cephcs.html