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类配置文件

<!-- Spring-Common.xml -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <bean id="OutputHelper" class="com.springtest.output.OutputHelper">
<property name="outputGenerator" ref="CsvOutputGenerator" />
</bean> <bean id="CsvOutputGenerator" class="com.springtest.output.impl.CsvOutputGenerator" />
<bean id="JsonOutputGenerator" class="com.springtest.output.impl.JsonOutputGenerator" /> </beans>

调用方式

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的声明

<bean id="helloBean" class="com.springtest.hello.impl.HelloWorldImpl">

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

@Configuration
public 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;
} }

配置文件

<bean id="OutputHelper" class="com.springtest.output.OutputHelper">
<property name="outputGenerator">
<ref bean="CsvOutputGenerator" />
</property>
</bean> <bean id="CsvOutputGenerator" class="com.springtest.output.impl.CsvOutputGenerator" />
<bean id="JsonOutputGenerator" class="com.springtest.output.impl.JsonOutputGenerator" />

构造函数注入

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

配置文件

<bean id="OutputHelper" class="com.springtest.output.OutputHelper">
<constructor-arg>
<bean class="com.springtest.output.impl.CsvOutputGenerator" />
</constructor-arg>
</bean> <bean id="CsvOutputGenerator" class="com.springtest.output.impl.CsvOutputGenerator" />
<bean id="JsonOutputGenerator" class="com.springtest.output.impl.JsonOutputGenerator" />

Spring Bean引用

Bean在不同的XML文件

<ref bean="someBean"/>

在同一个XML文件中的Bean

<ref local="someBean"/>

Spring bean属性值的注入

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

正常的方式

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

<bean id="FileNameGenerator" class="com.springtest.common.FileNameGenerator">
<property name="name">
<value>springtest</value>
</property>
<property name="type">
<value>txt</value>
</property>
</bean>

快捷方式

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

<bean id="FileNameGenerator" class="com.springtest.common.FileNameGenerator">
<property name="name" value="springtest" />
<property name="type" value="txt" />
</bean>

p模式

<bean id="FileNameGenerator" class="com.springtest.common.FileNameGenerator"
p:name="springtest" p:type="txt" />

加载多个配置文件

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <import resource="common/Spring-Common.xml"/>
<import resource="connection/Spring-Connection.xml"/>
<import resource="moduleA/Spring-ModuleA.xml"/> </beans>

加载方式

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

spring内部bean

一般的引用方式

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <bean id="CustomerBean" class="com.springtest.common.Customer">
<property name="person" ref="PersonBean" />
</bean> <bean id="PersonBean" class="com.springtest.common.Person">
<property name="name" value="springtest" />
<property name="address" value="address1" />
<property name="age" value="28" />
</bean> </beans>

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

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <bean id="CustomerBean" class="com.springtest.common.Customer">
<property name="person">
<bean class="com.springtest.common.Person">
<property name="name" value="springtest" />
<property name="address" value="address1" />
<property name="age" value="28" />
</bean>
</property>
</bean>
</beans>

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <bean id="CustomerBean" class="com.springtest.common.Customer">
<constructor-arg>
<bean class="com.springtest.common.Person">
<property name="name" value="springtest" />
<property name="address" value="address1" />
<property name="age" value="28" />
</bean>
</constructor-arg>
</bean>
</beans>

Spring Bean作用域

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

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

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

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

单例

<bean id="customerService"
class="com.springtest.customer.services.CustomerService" />

原型

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

<bean id="customerService" class="com.springtest.customer.services.CustomerService"
scope="prototype"/>

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

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

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

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

List注入方式

<property name="lists">
<list>
<value>1</value>
<ref bean="PersonBean" />
<bean class="com.springtest.common.Person">
<property name="name" value="springtestList" />
<property name="address" value="Hainan" />
<property name="age" value="28" />
</bean>
</list>
</property>

Set注入方式

<property name="sets">
<set>
<value>1</value>
<ref bean="PersonBean" />
<bean class="com.springtest.common.Person">
<property name="name" value="springtestSet" />
<property name="address" value="Hainan" />
<property name="age" value="28" />
</bean>
</set>
</property>

Map注入方式

<property name="maps">
<map>
<entry key="Key 1" value="1" />
<entry key="Key 2" value-ref="PersonBean" />
<entry key="Key 3">
<bean class="com.springtest.common.Person">
<property name="name" value="springtestMap" />
<property name="address" value="Hainan" />
<property name="age" value="28" />
</bean>
</entry>
</map>
</property>

Properties注入方式

<property name="pros">
<props>
<prop key="admin">admin@springtest.com</prop>
<prop key="support">support@springtest.com</prop>
</props>
</property>

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

方式一

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <bean id="CustomerBean" class="com.springtest.common.Customer">
<property name="lists">
<bean class="org.springframework.beans.factory.config.ListFactoryBean">
<property name="targetListClass">
<value>java.util.ArrayList</value>
</property>
<property name="sourceList">
<list>
<value>one</value>
<value>2</value>
<value>three</value>
</list>
</property>
</bean>
</property>
</bean> </beans>

方式二

通过util:list</util:list>

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-2.5.xsd"> <bean id="CustomerBean" class="com.springtest.common.Customer">
<property name="lists">
<util:list list-class="java.util.ArrayList">
<value>one</value>
<value>2</value>
<value>three</value>
</util:list>
</property>
</bean> </beans>

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

方式一

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <bean id="CustomerBean" class="com.springtest.common.Customer">
<property name="sets">
<bean class="org.springframework.beans.factory.config.SetFactoryBean">
<property name="targetSetClass">
<value>java.util.HashSet</value>
</property>
<property name="sourceSet">
<list>
<value>one</value>
<value>2</value>
<value>three</value>
</list>
</property>
</bean>
</property>
</bean> </beans>

方式二

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

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-2.5.xsd"> <bean id="CustomerBean" class="com.springtest.common.Customer">
<property name="sets">
<util:set set-class="java.util.HashSet">
<value>one</value>
<value>2</value>
<value>three</value>
</util:set>
</property>
</bean> </beans>

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

方式一

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <bean id="CustomerBean" class="com.springtest.common.Customer">
<property name="maps">
<bean class="org.springframework.beans.factory.config.MapFactoryBean">
<property name="targetMapClass">
<value>java.util.HashMap</value>
</property>
<property name="sourceMap">
<map>
<entry key="Key1" value="one" />
<entry key="Key2" value="two" />
<entry key="Key3" value="three" />
</map>
</property>
</bean>
</property>
</bean> </beans>

方式二

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

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-2.5.xsd"> <bean id="CustomerBean" class="com.springtest.common.Customer">
<property name="maps">
<util:map map-class="java.util.HashMap">
<entry key="Key1" value="1" />
<entry key="Key2" value="2" />
<entry key="Key3" value="3" />
</util:map>
</property>
</bean> </beans>

Spring PropertyPlaceholderConfigurer数据库配置

pom.xml中添加依赖

<!-- mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency> <!-- druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.20</version>
</dependency>

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

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

applicationContext.xml配置文件

<?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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 只需要加载service、dao即可,不需要加载controller -->
<context:component-scan base-package="com.quartz">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
<context:exclude-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice" />
</context:component-scan> <!-- 占位符 -->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:system-config.properties</value>
</list>
</property>
</bean> <!-- 防SQL注入过滤器 -->
<bean id="wall-filter" class="com.alibaba.druid.wall.WallFilter">
<property name="dbType" value="mysql" />
</bean>
<!-- 监控信息过滤器 -->
<bean id="stat-filter" class="com.alibaba.druid.filter.stat.StatFilter">
<!-- slowSqlMillis用来配置SQL慢的标准,执行时间超过slowSqlMillis的就是慢。 -->
<property name="slowSqlMillis" value="10000" />
<property name="logSlowSql" value="true" />
<property name="mergeSql" value="true" />
</bean> <!-- 数据源 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<!-- 基本属性 url、user、password -->
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<!-- 密码加密 -->
<property name="filters" value="config" />
<property name="connectionProperties" value="config.decrypt=true;config.decrypt.key=${jdbc.publicKey}" />
<property name="password" value="${jdbc.password}" /> <!-- 配置初始化大小、最小、最大 -->
<property name="initialSize" value="5" />
<property name="minIdle" value="5" />
<property name="maxActive" value="30" /> <!-- 配置获取连接等待超时的时间 -->
<property name="maxWait" value="60000" /> <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="60000" /> <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="300000" /> <property name="validationQuery" value="SELECT 'x'" />
<property name="testWhileIdle" value="true" />
<property name="testOnBorrow" value="false" />
<property name="testOnReturn" value="false" /> <!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->
<property name="poolPreparedStatements" value="false" />
<property name="maxPoolPreparedStatementPerConnectionSize" value="20" /> <!-- 超过时间限制是否回收 -->
<property name="removeAbandoned" value="true" />
<!-- 超时时间;单位为秒。180秒=3分钟 -->
<property name="removeAbandonedTimeout" value="180" />
<!-- 关闭abanded连接时输出错误日志 -->
<property name="logAbandoned" value="true" />
<property name="proxyFilters">
<list>
<!-- 监控信息过滤器 -->
<ref bean="stat-filter" />
<!-- 防注入的话从前台传排序字段排序不好用 -->
<ref bean="wall-filter" />
</list>
</property>
</bean> </beans>

Spring bean配置继承

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

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

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <bean id="BaseCustomerMalaysia" class="com.springtest.common.Customer">
<property name="country" value="Malaysia" />
</bean> <bean id="CustomerBean" parent="BaseCustomerMalaysia">
<property name="action" value="buy" />
<property name="type" value="1" />
</bean> </beans>

继承抽象

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

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <bean id="BaseCustomerMalaysia" class="com.springtest.common.Customer" abstract="true">
<property name="country" value="Malaysia" />
</bean> <bean id="CustomerBean" parent="BaseCustomerMalaysia">
<property name="action" value="buy" />
<property name="type" value="1" />
</bean> </beans>

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

纯继承模板和覆盖

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

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <bean id="BaseCustomerMalaysia" abstract="true">
<property name="country" value="Malaysia" />
</bean> <bean id="CustomerBean" parent="BaseCustomerMalaysia"
class="com.springtest.common.Customer">
<property name="country" value="Japan" /> <!--覆盖-->
<property name="action" value="buy" />
<property name="type" value="1" />
</bean> </beans>

Spring依赖检查

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

依赖检查模式

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

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

注:默认模式是 none

dependency-check="simple"

<bean id="CustomerBean" class="com.springtest.common.Customer"
dependency-check="simple"> <property name="person" ref="PersonBean" />
<property name="action" value="buy" />
</bean>

Spring 特定属性依赖检查

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

配置文件设置

方式一

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

<beans
...
xmlns:context="http://www.springframework.org/schema/context"
...
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">
...
<context:annotation-config />
...
</beans>

方式二

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

** bean 设置 **

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

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

Spring自定义@Required-style注解

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

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

注解注册

<bean class="org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor">
<property name="requiredAnnotationType" value="com.springtest.common.Mandatory"/>
</bean>

注解引用

@Mandatory
public 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

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <bean id="customerService" class="com.springtest.customer.services.CustomerService"
init-method="initIt" destroy-method="cleanUp"> <property name="message" value="i'm property message" />
</bean> </beans>

方式三

使用@PostConstruct@PreDestroy 注解

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

添加注解扫描

通过CommonAnnotationBeanPostProcessor的方式

<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor" />

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

<context:annotation-config />

注解应用

@PostConstruct
public void initIt() throws Exception {
System.out.println("Init method after properties are set : " + message);
} @PreDestroy
public 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泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。

注册扫描组件

<context:component-scan base-package="com.springtest.customer" />

Spring过滤器组件自动扫描

添加过滤器

不包含过滤器

<!-- 只需要加载service、dao即可,不需要加载controller -->
<context:component-scan base-package="com.springtest">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
<context:exclude-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice" />
</context:component-scan>

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

<!-- 扫描所有controller组件 -->
<context:component-scan base-package="com.quartz">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
<context:include-filter type="annotation"
expression="org.springframework.web.bind.annotation.ControllerAdvice"/>
</context:component-scan> <!--注册requestmapping,否则无法扫描@RequestMapping的注解-->
<mvc:annotation-driven />

包含过滤器

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd"> <context:component-scan base-package="com.springtest" > <context:include-filter type="regex"
expression="com.springtest.customer.dao.*DAO.*" /> <context:include-filter type="regex"
expression="com.springtest.customer.services.*Service.*" /> </context:component-scan> </beans>

Spring自动注入Beans实体

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

autowire

autowire提供5种装配方式。

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

@Autowired

  • 建议采用此种方式。

注册AutowiredAnnotationBeanPostProcessor

方式1:

<context:annotation-config />

方式2:

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

使用

@Autowired
private Person person;

Spring AOP切面(Advice)编程

可以有多种方式,其中面向方法的切面可参考,Spring AOP基于配置文件的面向方法的切面

jdbc操作

Spring基础知识的更多相关文章

  1. spring 基础知识复习

    spring是一个分层架构,由 7 个定义良好的模块组成.Spring 模块构建在核心容器之上,核心容器定义了创建.配置和管理 bean 的方式. 组成spring框架的每个模块(或组件)都可单独存在 ...

  2. Spring 基础知识

    Spring架构简单描述 原文:https://www.shiyanlou.com/courses/document/212 Spring 概述 1. Spring 是什么 Spring是一个开源的轻 ...

  3. Spring基础知识之基于注解的AOP

    背景概念: 1)横切关注点:散布在应用中多处的功能称为横切关注点 2)通知(Advice):切面完成的工作.通知定了了切面是什么及何时调用. 5中可以应用的通知: 前置通知(Before):在目标方法 ...

  4. 1.spring基础知识讲解

    引言:以下记录一些自己在使用时pringle框架时的一些自己心得合成体会时,如有侵权,请联系本博主. 1. spring基本都使用 spring是一个开源的轻量级框架,其目的是用于简化企业级应用程序开 ...

  5. Spring基础知识详解

    Spring 概述 1. 什么是spring? Spring 是个java企业级应用的开源开发框架.Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用.Spring ...

  6. Spring基础知识之装配Bean

    装配(wiring):创建应用对象之间协作关系的行为.这是依赖注入的本质. Spring配置的可选方案 Spring提供了三种装配机智: 1)在XML中进行显示装配 2)在java中进行显示装配 3) ...

  7. Spring基础知识汇总

    Spring优点: 低侵入式设计,代码的污染极低: 独立于各种应用服务器,基于Spring框架的应用,可以真正实现Write Once,Run Anywhere的承诺: Spring的IoC容器降低了 ...

  8. Spring基础知识及bean的配置

    IOC与DI: IOC(inversion of control):其思想是反转资源获取的方向.传统的资源查找方式要求组件向容器发起请求查找资源.作为回应,容器适时的返回资源.而应用了IOC之后,则是 ...

  9. Spring基础知识汇总 Java开发必看

    Spring简介 Spring框架由Rod Johnson开发,2004年发布了Spring框架的第一版.Spring是一个从实际开发中抽取出来的框架,因此它完成了大量开发中的通用步骤,留给开发者的仅 ...

随机推荐

  1. PyCharm3.0默认快捷键(翻译的)

    PyCharm3.0默认快捷键(翻译的) PyCharm Default Keymap 1.编辑(Editing) Ctrl + Space    基本的代码完成(类.方法.属性)Ctrl + Alt ...

  2. OrchardNoCMS vNext如何在VS2015下调试

    由于VS2015还没有出来正式版,ASP.NET 5也是没有出来正式版.所以在你下载了OrchardNoCMS vNext的代码后,需要配置一些东西,才能启动项目,开始调试. 需要注意以下几点: 1. ...

  3. Android 自定义Dialog类,并在Activity中实现按钮监听。

      实际开发中,经常会用到Dialog,比如退出时候会弹出是否退出,或者还有一些编辑框也会用Dialog实现,效果图如下: 开发中遇到的问题无非在于如果在Activity中监听这个Dialog中实现的 ...

  4. JS组件系列——Bootstrap Table 冻结列功能IE浏览器兼容性问题解决方案

    前言:最近项目里面需要用到表格的冻结列功能,所谓“冻结列”,就是某些情况下表格的列比较多,需要固定前面的几列,后面的列滚动.遗憾的是,bootstrap table里自带的fixed column功能 ...

  5. 【JavaScript】js数组操作,由push到那么多

    shift() 定义:删除并返回数组的第一个元素: pop() 定义:删除数组最后一个元素,并返回: push() 定义:在数组后边添加一个或者多个元素,并返回新数组的长度: array.push(& ...

  6. 显式意图启动一个Activity

    显式意图主要是通过指定包名和类名开启一个组件,主要用于安全性要求高的,且不想被其他应用开启,可以不配置应用过滤器. 1.创建意图对象 Intent intent = new Intent(); 2.指 ...

  7. C#-WinForm-用户控件如何获取父级窗体

    1:在父窗体中定义需要在用户控件中用到的控件属性,比如,我要修改一个textbox控件.页面定义这个textbox的属性是:protected System.Web.UI.WebControls.Te ...

  8. 动态树之LCT(link-cut tree)讲解

    动态树是一类要求维护森林的连通性的题的总称,这类问题要求维护某个点到根的某些数据,支持树的切分,合并,以及对子树的某些操作.其中解决这一问题的某些简化版(不包括对子树的操作)的基础数据结构就是LCT( ...

  9. tensrflow python [defunct]

    在ubuntu上面安装了GPU版本的tensorflow后,很容易碰到zombie thread 的问题,无法正常关闭tensorflow的线程,用ps aux|grep python可以看到 pyt ...

  10. python的颜色显示

    我们知道在命令行下,python的输出的字符串颜色和一般字符相同. 若我们想强调某些字符,我们可以利用代码将要强调的部分变成某种颜色. 在linux终端命令可以显示某种颜色,在windows的cmd终 ...