Spring 笔记

1, 新建包或导入工程错误提示:
  The type javax.servlet.ServletContext cannot be resolved. It is indirectly referenced from required .class files。
  解决方法:在安装的tomcat下的lib目录里面找到servlet-api.jar包,导入项目下的lib文件夹中即可。

2,Could not load the Tomcat server configuration at /Servers/Tomcat v7.0 Server at localhost-config. T

  Eclipse新建Server时,会在 当前workspace目录下新建 /Servers/Tomacat v7.0 Server at localhost-config目录,
  然后将/opt/ apache-tomacat-7.0.59/conf 目录下的所有文件拷贝到这里。Eclipse没有访问它的权限,所以无法拷贝,那么Server自然创建失败。

  解决方法:删了重建

3,@RequestParam传参解决中文乱码
1)post方法
@RequestMapping(value="login.do", produces="text/html;charset=utf-8")
-->login.do 表单提交地址

2)get方式
String user=new String(username.getBytes("iso-8859-1"),"utf-8");
String pwd=new String(password.getBytes("iso-8859-1"),"utf-8");
-->注意,如果进来的是中文未乱码,此方法转换返回 ????

4,服务器启动
Result Maps collection already contains value forxxx”的解决方案
-->Eclipse编译了一份在bin目录下,将bin目录或者WEB-INF下class目录清空即可

5,注入null和空字符串值
<bean id="student" class="com.spring.entity.Student">
<property name="stuName"> <null /> </property>
</bean>

<bean id="student" class="com.spring.entity.Student">
<property name="stuName"> <value></value> </property>
</bean>

6,Bean的作用域
<bean id="student" class="com.spring.entity.Student" scope="singleton"/>
singleton : 默认值,Spring以单例模式创建bean的实例,即容器中该bean的实例只有一个
prototype : 每次从容器中获取bean时,都会创建一个新的实例
request : 用于web应用环境,针对每次http请求都会创建一个实例
session : 用于web应用环境,同一个会话共享用一个实例,不同的会话使用不同的实例
global session : 仅在Portlet的web应用中使用,同一个全局会话共享一个实例;对于非Portlet环境,等同于session
===>使用 request,session,global session 需要在 web.xml 中配置一个请求监听器
<listener>
<listener-class>
org.springframework.web.context.request.RequestContextListener
</listener-class>
</listener>

7,注解
@Component("xxxx") : 标注一个普通的Spring Bean类
@Repository("xxxx") : 用于标注DAO类
@Service("xxxx") : 用于标注业务类
@Controller("xxxx") : 用于标注控制器类

添加命名空间:
xmlns:context="http://www.springframework.org/schema/context"
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd"
<!-- 扫描包中注解标注的类 -->
<context:component-scan base-package=" 包名 "></context:component-scan>

@Scope() : 指定bean的作用域
@Autowired : 自动装配

8,AOP aspect oriented programming
增强 advice
切入点 pointcut
连接点 joinpoint
切面 aspect
代理 proxy
目标对象 target
织入 weaving
示例:
<!-- 声明切面类 -->
<bean id="testLogger" class="com.spring.logger.TestLogger" />
<aop:config>
<aop:pointcut expression="execution(* com.spring.service.impl.*.*(..))"
id="pointcut"/>
<aop:aspect ref="testLogger">
<aop:before method="beforeLogger" pointcut-ref="pointcut"/>
</aop:aspect>
</aop:config>

execution : 切入点指示符,括号中是切入点表达式
public * addUser(com.entity.User) : "*" 表示匹配所有类型的返回值 , 方法名( 参数 )
public void *(com.entity.User) : "*" 表示匹配所有方法名
public void addUser(..) : ".." 表示匹配所有参数个数和类型
* com.service.*.*(..) : 表示匹配 com.service 包下所有类的所有方法
* com.service..*(..): 表示匹配 com.service 包及其子包下所有类的所有方法
9,增强处理类型
Before : 前置增强处理,在目标方法前织入增强处理
AfterReturning : 后置增强处理,在目标方法正常执行(不出现异常)后织入增强处理
AfterThrowing : 异常增强处理,在目标方法抛出异常后织入增强处理
After : 最终增强处理,不论方法是否抛出异常,都会在目标方法最后织入增强处理
Around : 环绕增强处理,在目标方法的前后都可以织入增强处理
示例:
public void afterReturningLogger(JoinPoint jp, Object result){
执行方法的名称-->jp.getSignature().getName()
方法的参数-->jp.getArgs()[0]
方法返回的值:"+result
===><aop:after-returning method="afterReturningLogger"
pointcut-ref="pointcut" returning="result"/>
获取方法返回值需加 returning 属性

>环绕增强 : 第一个参数必须是 ProceedingJoinPoint ,并且使用 pjp.proceed() 调用目标方法
public void around(ProceedingJoinPoint pjp) throws Throwable{
System.out.println("aop:around 方法");
System.out.println("aop:around 目标方法前执行----------------->");
pjp.proceed();
System.out.println("aop:around 目标方法后执行----------------->");
}
---><aop:around method="around" pointcut-ref="pointcut"/>

10,设值注入 和 构造注入
设值注入 : 通过setter访问器实现,灵活性好,时效性差
构造注入 : 通过构造方法实现,灵活性差,时效性好

设值输入示例:
public void setStudentDao(StudentDao studentDao) {
this.studentDao = studentDao;
}

<bean id="studentDaoImpl" class="com.spring.dao.impl.StudentDaoImpl" />
<bean id="studentServiceImpl" class="com.spring.service.impl.StudentServiceImpl">
<property name="studentDao">
<ref bean="studentDaoImpl"/>
</property>
</bean>
构造方法注入:
public GradeServiceImpl(GradeDao gradeDao) {
this.gradeDao = gradeDao;
}

<bean id="gradeDao" class="com.spring.dao.impl.GradeDaoImpl"></bean>
<bean id="gradeServiceImpl" class="com.spring.service.impl.GradeServiceImpl">
<!-- 使用构造方法为 gradeService 的 gradeDao 属性赋值-->
<constructor-arg>
<ref bean="gradeDao"/>
</constructor-arg>
</bean>

调用实例工厂方法创建Bean
factory-bean: 该属性的值为工厂Bean的id。
factory-method: 该属性指定实例工厂的工厂方法。

<bean id="dateFormat" class="java.text.SimpleDateFormat">
<constructor-arg value="yyyy-MM-dd" />
</bean>

<bean id="grade" class="com.spring.entity.Grade">
<property name="date">
<bean factory-bean="dateFormat" factory-method="parse">
<constructor-arg value="2017-06-06" />
</bean>
</property>
</bean>

11,使用 p 命名空间注入bean的属性
property 注入:
<bean id="studentServiceImpl" class="com.spring.service.impl.StudentServiceImpl">
<property name="studentDao">
<ref bean="studentDaoImpl"/>
</property>
</bean>

p命名: 添加 xmlns:p="http://www.springframework.org/schema/p"
<bean id="studentServiceImpl" class="com.spring.service.impl.StudentServiceImpl"
p:studentDao-ref="studentDaoImpl" />

注意:
对于直接量(基本数据类型,字符串)属性,使用方式如下:
p:属性名 = "属性值"
对于引用Bean的属性,使用方法如下:
p:属性名-ref = "bean的ID"
12,使用内部bean
如果一个bean组件仅在一处使用,可以把它定义为内部bean
<bean id="studentServiceImpl" class="com.spring.service.impl.StudentServiceImpl">
<property name="studentDao">
<bean class="com.spring.dao.impl.StudentDaoImpl"/> <--------
</property>
</bean>

13, bean 和 local 的区别
<property name="studentDao">
<ref bean="studentDaoImpl"/> 或 <ref local="studentDaoImpl"/>
</property>
local属性只能在同一个配置文件中检索bean的ID,而使用bean属性可以在其他配置文件中检索ID

14,注入集合类型
<property name="hobbies">
<list>
<value>xxxx</value> 或 <ref bean=""/>
<value>xxxx</value>
</list>
</property>

<property name="hobbies">
<set>
<value>xxxx</value> 或 <ref bean=""/>
<value>xxxx</value>
</set>
</property>

<property name="hobbies">
<map>
<entry>
<key> <value>xxxx</value> </key>
<value>xxxx</value>
</entry>
<entry>
<key> <value>xxxx</value> </key>
<value>xxxx</value>
</entry>
</map>
</property>

====> <entry key="xx" value="xxxx" /> 简写形式

Properties类型:
<property name="hobbies">
<props>
<prop key="xxx">xxx</prop>
<prop key="xxx">xxx</prop>
</props>
</property>

15,使用接口实现增强方法
implements AfterReturningAdvice
implements MethodBeforeAdvice
implements MethodInterceptor
示例:
public class ServiceAdvice implements MethodBeforeAdvice{}

<bean id="serviceBeforeAdvice" class="com.spring.logger.ServiceAdvice"></bean>
<aop:config>
<aop:pointcut expression="execution(* com.spring.service.impl.GradeServiceImpl.*(..))"
id="gradeservice_cut"/>
<aop:advisor advice-ref="serviceBeforeAdvice" pointcut-ref="gradeservice_cut"/>
</aop:config>

使用POJO普通类实现增强方法 (推荐)

public class TestLogger {}

<bean id="testLogger" class="com.spring.logger.TestLogger" />
<aop:config>
<aop:pointcut expression="execution(* com.spring.service.impl.StudentServiceImpl.*(..))"
id="pointcut"/>
<aop:aspect ref="testLogger">
<aop:around method="around" pointcut-ref="pointcut"/>
</aop:aspect>
</aop:config>

15,ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

两种方法:
a. ClasspathResource res = new ClasspathResource(“a.xml,b.xml,……”);
多个资源文件路径之间可以是用” ,; /t/n”等分隔。
b. ClasspathResource res = new ClasspathResource(newString[]{“a.xml”,”b.xml”,……});

16,bean组件, 通过无参构造方法实例化对象,setter方法设值

时间: 2024-09-30 16:26:13

Spring 笔记的相关文章

Spring笔记(4)-----&lt;bean&gt;的基本配置

Spring容器成功需要具备的三个条件: 1)Spring框架的类包都已经放在应用程序的类路径下. 2)应用程序为Spring提供了完备的Bean配置信息. 3)Bean的类都已经放在类路径下. Spring启动时读取应用程序的Bean配置信息,在容器中生成一份相应的Bean配置注册表,然后根据这张注册表实例化Bean,装配好Bean的依赖关系,为上层应用提供准备就绪的运行环境. Bean的配置信息是Bean的元数据信息,有4部分: 1)Bean的实现类. 2)Bean的属性信息. 3)Bean

spring笔记(一)

这几日,在看spring框架的知识,了解了一下spring的IoC核心,AOP的概念,然后剩下的其实就是Spring对于其他的java服务的封装:ORM,web, JMS,JMX等. 坦白地说,我并没有完全理解spring的结构,首先它的API,我还不是很清楚,现在能至少做个分类.其次,spring框架和ORM之类的框架在做集成时的编程经验,我还没有. 后面的路要一分为二,继续对于spring底层的细节进行学习和了解,其次对于spring和其他组件整合的知识在实践中学习.看书估计不管用了. sp

Spring笔记(二):Ioc 之注入与装配

一.Spring依赖注入的原理 二.依赖注入的实现 (一)对象的注入 1.简单属性注入 1)源代码 package main.java.com.spring.ioc.base.dao.impl; import main.java.com.spring.ioc.base.dao.PersonDao; /** * * PersonDiDaoImpl * @title * @desc * @author SAM-SHO * @Dec 28, 2014 */ public class PersonDiD

Spring笔记1

Spring依赖应用上下文xml文件(beans.xml或ApplicationContext.xml)进行对象定义,完成核心工作.可以在xml文件中import其他的xml文件(如数据库,<import resource="spring/dao/MySQL-datasource.xml"/>).beans为Map<String,Object>结构. AOP即面向切面编程(Aspect Oriented Programming). jdom包用于解析xml文件,

Spring笔记(一):Ioc 之 Bean的管理

前提: 1.需要 spring.dom4j.junit.commons-logging等的jar包, 配置web.xml,新增 applicationContext.xml 2.Spring主要核心是: 1)控制反转(IOC):以前传统的java开发模式中,当需要一个对象时我们,我们会自己使用new或者getInstance等直接或者间接调用构造方法创建一个对象,而在Spring开发模式中,Spring容器使用了工厂模式为我们创建了所需要的对象,我们使用时不需要自己去创建,直接调用Spring为

spring笔记(三)

Spring 第二天: 1. 代理模式 2. Aop编程 3.Spring对Jdbc的支持 JdbcTemplate工具类 思考: 程序的"事务控制", 可以用aop实现! 即只需要写一次,运行时候动态织入到业务方法上. Spring提供了对事务的管理,开发者只需要按照Spring的方式去做就行. 目标: 1. Spring声明式事务管理 * XML配置 *注解方式 2. Spring与Hibernate整合 3.  SSH整合 1. 程序中事务控制 1.1 环境准备 用户访问->

spring笔记一

Spring最有用的地方就是IOC.虽然代码很简单,但实际上最有用. IoC是什么? Ioc-Inversion of Control,即"控制反转",不是什么技术,而是一种设计思想. 我们在Biz的文件夹下面,创建一个类SpringContext.java public class SpringContext{ private static ApplicationContext ctx;//静态变量 //get()方法 Public static ApplicationContext

Spring笔记3

annotation(注解)(可见Spring_pref,3.11) 加入annotation,需要在beans.xml的<beans>标签加属性xmlns:context="http://www.springframework.org/schema/context",并在<beans>标签辖内加标签<context:annotation-config />.前者是新增的xml的命名空间,后者表示该xml文件的bean有参与注解的.前者属性中,冒号前

Spring笔记2

IOC/DI简介: DI为依赖注入,通常来说bean是自己控制对象的实例化等工作(即依赖关系).但在Spring容器中,创建bean的同时完成了注入依赖关系的工作. IOC为控制反转,其与DI的意义类似,即本来bean自己控制实例化,现在成了创建bean时便完成了实例化等依赖工作,所以称为控制反转. ”依赖注入(DI)背后的基本原理是对象之间的依赖关系(即一起工作的其它对象)只会通过以下几种方式来实现:构造器的参数.工厂方法的参数,或给由构造函数或者工厂方法创建的对象设置属性.因此,容器的工作就