博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring基础知识
阅读量:5931 次
发布时间:2019-06-19

本文共 10702 字,大约阅读时间需要 35 分钟。

Spring基础知识

利用spring完成松耦合

接口

public interface IOutputGenerator{    public void generateOutput();}

实现类

csv输出

public class CsvOutputGenerator implements IOutputGenerator{    public void generateOutput(){        System.out.println("Csv Output Generator");    }}

json输出

public class JsonOutputGenerator implements IOutputGenerator{    public void generateOutput(){        System.out.println("Json Output Generator");    }}

辅助类

public class OutputHelper{    IOutputGenerator outputGenerator;    public void generateOutput(){        outputGenerator.generateOutput();    }    public void setOutputGenerator(IOutputGenerator outputGenerator){        this.outputGenerator = outputGenerator;    }}

bean类配置文件

调用方式

public static void main( String[] args ){  ApplicationContext context =     new ClassPathXmlApplicationContext(new String[] {"Spring-Common.xml"});  OutputHelper output = (OutputHelper)context.getBean("OutputHelper");  output.generateOutput();}

结论

通过spring bean的方式进行配置可以灵活地将不同需求通过配置文件来完成,而不是改java原代码。通过面向接口的编程并结合spring的配置便可达到解耦的目的。

Spring JavaConfig实例

通常我们是通过xml的方式进行bean的声明

使用 @Configuration 注释告诉 Spring,这是核心的 Spring 配置文件,并通过 @Bean 定义 bean。

@Configurationpublic class AppConfig {    @Bean(name="helloBean")    public HelloWorld helloWorld() {        return new HelloWorldImpl();    }}

Spring依赖注入(DI)

spring有两种注入的方式

  • setter方法注入
  • getter方法注入

setter方法注入

public class OutputHelper{    IOutputGenerator outputGenerator;    public void setOutputGenerator(IOutputGenerator outputGenerator){        this.outputGenerator = outputGenerator;    }}

配置文件

构造函数注入

public class OutputHelper{    IOutputGenerator outputGenerator;        OutputHelper(IOutputGenerator outputGenerator){        this.outputGenerator = outputGenerator;    }}

配置文件

Spring Bean引用

Bean在不同的XML文件

在同一个XML文件中的Bean

Spring bean属性值的注入

  • 正常的方式
  • 快捷方式
  • p模式

正常的方式

在一个value标签注入值,并附有property标签结束。

springtest
txt

快捷方式

<property name="type" value="txt" />

p模式

加载多个配置文件

加载方式

ApplicationContext context =            new ClassPathXmlApplicationContext(Spring-All-Module.xml);

spring内部bean

一般的引用方式

如果一个bean仅仅是作为一个bean的内部bean。那么可以声明为内部bean。

Spring Bean作用域

在Spring中,bean作用域用于确定哪种类型的 bean 实例应该从Spring容器中返回给调用者。bean支持的5种范围域:

  • 单例 - 每个Spring IoC 容器返回一个bean实例
  • 原型- 当每次请求时返回一个新的bean实例
  • 请求 - 返回每个HTTP请求的一个Bean实例
  • 会话 - 返回每个HTTP会话的一个bean实例
  • 全局会话- 返回全局HTTP会话的一个bean实例

在大多数情况下,可能只处理了 Spring 的核心作用域 - 单例和原型,默认作用域是单例

注:意味着只有在一个基于web的Spring ApplicationContext情形下有效!

单例

原型

bean声明时添加scope="prototype"属性。

此外还可以通过注解的方式来指定作用域。

Spring集合 (List,Set,Map,Properties)

spring支持4个主要的集合类型。

  • List – <list/>
  • Set – <set/>
  • Map – <map/>
  • Properties – <props/>

List注入方式

1

Set注入方式

1

Map注入方式

Properties注入方式

admin@springtest.com
support@springtest.com

Spring ListFactoryBean 创建一个具体的列表集合类(ArrayList和LinkedList)

方式一

java.util.ArrayList
one
2
three

方式二

通过

one
2
three

Spring SetFactoryBean创建一个具体的Set集合(HashSet 和 TreeSet)

方式一

java.util.HashSet
one
2
three

方式二

通过<util:set></util:set>

one
2
three

Spring MapFactoryBean创建一个具体的Map集合类(HashMap和TreeMap)

方式一

java.util.HashMap

方式二

通过<util:map></util:map>

Spring PropertyPlaceholderConfigurer数据库配置

pom.xml中添加依赖

mysql
mysql-connector-java
5.1.38
com.alibaba
druid
1.0.20

属性配置文件:system-config.properties

################################################# DataSource Configjdbc.url=jdbc\:mysql\://127.0.0.1:3306/quartz?useUnicode\=true&characterEncoding\=utf8&autoReconnect\=true&useSSL\=false&zeroDateTimeBehavior\=convertToNulljdbc.username=rootjdbc.publicKey=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALIT9sFn8U+Hoo80Q+Hepwc0ZN6HBiyAW4SiLCXLhNNjxB45mtRamABoB0O9dEsziT/gwtuXMuC2bWePdCvEb1ECAwEAAQ==jdbc.password=fCHxOiDBDsWY/BJLg05fbNGvQmDRPZJufcvyqCqml+zwmB4Gw/Bn7lzy8w117CQ1jEBFpj0ERgQsCBJD0ROfJw==

applicationContext.xml配置文件

classpath:system-config.properties

Spring bean配置继承

在 Spring,继承是用为支持bean设置一个 bean 来分享共同的值,属性或配置。可通过parent属性进行配置。

一个子 bean 或继承的bean可以继承其父 bean 的配置,属性和一些属性。另外,子 Bean 允许覆盖继承的值。

继承抽象

如果你要让这个 bean 作为一个基础模板,不允许别人来实例化它,可以在一个元素中添加一个abstract的属性。

如果想实例化BaseCustomerMalaysia则会报错。

纯继承模板和覆盖

父 bean 是不需要定义类的属性,很多时候,你可能只需要一个共同的属性共享。

Spring依赖检查

在Spring中,可以使用依赖检查功能,以确保所要求的属性可设置或者注入。

依赖检查模式

4个依赖检查支持的模式:

  • none – 没有依赖检查,这是默认的模式。
  • simple – 如果基本类型(int, long,double…)和集合类型(map, list..)的任何属性都没有设置,UnsatisfiedDependencyException将被抛出。
  • objects – 如果对象类型的任何属性都没有设置,UnsatisfiedDependencyException将被抛出。
  • all – 如果任何类型的任何属性都没有被设置,UnsatisfiedDependencyException将被抛出。

注:默认模式是 none

dependency-check="simple"

Spring 特定属性依赖检查

通过dependency-check的方式进行依赖检查是对整个类型的属性都进行了检查。然而大多数情况下只需要对某个属性进行检查即可。因此引入了@Required注解对某个属性进行检查。

配置文件设置

方式一

添加 Spring 上下文和 <context:annotation-config />在bean配置文件。

...
...

方式二

<bean class="org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor"/>

** bean 设置 **

在对应属性的set方法上添加@Required

@Requiredpublic void setPerson(Person person) {  this.person = person;}

Spring自定义@Required-style注解

创建注解接口Mandatory(名称可以自己起)

@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.METHOD)public @interface Mandatory {}

注解注册

注解引用

@Mandatorypublic void setPerson(Person person) {  this.person = person;}

至此,创建了一个新的自定义命名 @Required-style的@Mandatory 注解,相当于 @Required 注解。

spring bean初始化准备和销毁清理

方式一:

Spring Bean InitializingBeanDisposableBean

  • 如果bean实现了InitializingBean,则afterPropertiesSet()会在所有的 bean 属性设置后执行。
  • 如果bean实现了DisposableBean,则destroy()会在Spring容器释放后执行。

注意:但不建议这样使用。因为这样增加了代码与spring的耦合度。

方式二

因此建议使用init-methoddestroy-method

方式三

使用@PostConstruct@PreDestroy 注解

  • 注:@PostConstruct@PreDestroy 标注不属于 Spring,它是在J2EE库- common-annotations.jar

添加注解扫描

通过CommonAnnotationBeanPostProcessor的方式

通过<context:annotation-config />的方式

注解应用

@PostConstructpublic void initIt() throws Exception {  System.out.println("Init method after properties are set : " + message);}@PreDestroypublic void cleanUp() throws Exception {  System.out.println("Spring Container is destroy! Customer clean up");}

spring el表达式

spring 自动扫描组件

  • @Entity实体bean
  • @Service用于标注业务层组件
  • @Controller用于标注控制层组件(如struts中的action)
  • @Repository用于标注数据访问组件,即DAO组件
  • @Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。

注册扫描组件

Spring过滤器组件自动扫描

添加过滤器

不包含过滤器

一般结合spring mvc自动扫描组件一起用

包含过滤器

Spring自动注入Beans实体

通过autowire(此种方式基本不用了)属性和@Autowired (一般采用这种方式进行处理)注解

autowire

autowire提供5种装配方式。

  • no – 缺省情况下,自动配置是通过“ref”属性手动设定
  • byName – 根据属性名称自动装配。如果一个bean的名称和其他bean属性的名称是一样的,将会自装配它。
  • byType – 按数据类型自动装配。如果一个bean的数据类型是用其它bean属性的数据类型,兼容并自动装配它。
  • constructor – 在构造函数参数的byType方式。
  • autodetect – 如果找到默认的构造函数,使用“自动装配用构造”; 否则,使用“按类型自动装配”。

@Autowired

  • 建议采用此种方式。

注册AutowiredAnnotationBeanPostProcessor

方式1:

方式2:

使用

@Autowired    private Person person;

Spring AOP切面(Advice)编程

可以有多种方式,其中面向方法的切面可参考,

jdbc操作

转载地址:http://zuutx.baihongyu.com/

你可能感兴趣的文章
go语言的http包
查看>>
android 收集
查看>>
SpringBoot之SpringCloud体验
查看>>
常用正则
查看>>
Win8(X64)下安装配置卸载Apache2.4.12(httpd-2.4.12-x64-vc11
查看>>
memcached常见命令
查看>>
谈谈前端工程化 js加载
查看>>
jsp内置对象
查看>>
hive join 空指针异常
查看>>
java web 项目 推荐目录结构
查看>>
Struts2参数知识点
查看>>
git的使用
查看>>
google map 画图
查看>>
left join on and 与 left join on where的区别
查看>>
Android 百度地图开发(二)
查看>>
Android Studio JNI开发
查看>>
PHP 运算符
查看>>
关于 DDWRT, Tomato, Openwrt 的试用心得
查看>>
框架的概念及用反射技术开发框架的原理--getResourceAsStream用法详解
查看>>
mac os 的brew 使用攻略,解决mac命令行下代理的问题。
查看>>