Spring笔记+心得
来源:互联网 发布:20人企业网络解决方案 编辑:程序博客网 时间:2024/04/30 12:42
IOC:inverse of control 控制反转
菜鸡LZ的个人见解:就是@Resource跟@Component
@Component(“testClass")
TestClass类存放进spring里,名字叫做testClass
@Resource(name="testClass")
要用到TestClass的时候,加个标签@Resource(name="testClass"),就取得资源了
ps:建议此方法写在set方法里。
例如:
public HibernateTemplate getHibernateTemplate() {return hibernateTemplate;}@Resource(name="hibernateTemplate")public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {this.hibernateTemplate = hibernateTemplate;}
需要用到HibernateTemplate类的时候
这个时候可能会问:那我一定通过@resource才能拿到这个class对象么。
答案是否定的。
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");BLLFacade bf = (BLLFacade) context.getBean("bllFacade");这里扫描了spring的xml文件,然后要用到的时候,context.getBean()方法
下面的是 与hibernate的结合的配置:
先来一个beans.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-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"> <context:annotation-config/>//使用annotation的方式进行注释 <context:component-scan base-package="cn"/>//启动程序时,扫描cn目录下的所有的JavaBean <bean id="mappings" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">//采用xml文件映射方式编写配置 <property name="locations"> //xml文件存放地址 <value>classpath:jdbc.properties</value> </property> </bean> <bean id="dataSource" destroy-method="close" //配置数据源,ps:数据库的驱动、路径、账号、密码 class="org.apache.commons.dbcp.BasicDataSource"> //均采用占位符的方式进行配置,占位符来自jdbc.properties文件 <property name="driverClassName" value="${jdbc.driverClassName}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> //配置sessionFactory,注意class别写错了,LZ血一般的教训,中间的annotation写漏了,一直报错。 <property name="dataSource" ref="dataSource" />//hibernate是需要实体映射到数据库的,一个javabean对应数据库的一张表//这里有两种方式://第一种 在sessionfactory下配置property name=“annotatedClasses”//list标签里写javabean的路径 跟hibernate.cfg.xml里的 <mapping classs="cn.Entity.User"> 一样的模式 <!-- <property name="annotatedClasses"> <list> <value>cn.Entity.User</value> </list> </property> -->//第二种 跟扫描javabean一样的方式,写个主目录,spring自动帮你扫描 <property name="packagesToScan"> <list> <value>cn.Entity</value> </list> </property>//配合hibernate的属性,类似:方言、打印sql语句的格式 <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> <prop key="hibernate.show_sql">true</prop> </props> </property> </bean> //配置hibernate模板,ps:hibernate模板自动封装好了事物,事物的回滚等,保存只要调用save方法即可。 <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate"> <property name="sessionFactory" ref="sessionFactory"></property> </bean>
//原来还有配置daosupport的,但是比较麻烦,建议使用hibernate模板
</beans>
这里是:jdbc.properties文件。目录就是src下的
jdbc.driverClassName = com.mysql.jdbc.Driver
jdbc.url = jdbc:mysql://localhost:3306/aotuman
jdbc.username = root
jdbc.password =123456
public class DAOMsg extends DAOAbstract{//private SessionFactory sf = new AnnotationConfiguration().configure().buildSessionFactory();private HibernateTemplate hibernateTemplate;public HibernateTemplate getHibernateTemplate() {return hibernateTemplate;}@Resource(name="hibernateTemplate")public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {this.hibernateTemplate = hibernateTemplate;}/** * 添加留言 */@Overrideprotected boolean addMsg(Msg msg) {hibernateTemplate.save(msg);return true;}/** * 修改留言 */@Overrideprotected boolean editMsg(Msg msg) {hibernateTemplate.update(msg);return true; }}
--------------------------------------------------------------------------------------------------咯咯咯咯咯咯-----------------------------------------------------------------------------------------------
2014-04-15
今天想给服务器加上spring,并且spring整合hibernate。
但是发现加上去有错误。因为是这个项目这个版本做的差不多了,再加上lz对于spring的实际运用也就局限在自己测试的类里,结果一加上去就报了NullPointer错误
打印出来的 hibernateTmplate是null
于是乎lz准备对spring好好的攻克一下。
晚上lz写了个测试类:
package cn.Entity;//实体import java.util.Date;import javax.persistence.Entity;import javax.persistence.Id;@Entitypublic class User {private int UserID;private String UserName;@Idpublic int getUserID() {return UserID;}public void setUserID(int userID) {UserID = userID;}public String getUserName() {return UserName;}public void setUserName(String userName) {UserName = userName;}}
package cn.DAO;//数据访问类import java.util.List;import javax.annotation.Resource;import org.aspectj.weaver.patterns.ThisOrTargetAnnotationPointcut;import org.springframework.orm.hibernate3.HibernateTemplate;import org.springframework.stereotype.Component;@Componentpublic class DAO {private HibernateTemplate hibernateTemplate;public HibernateTemplate getHibernateTemplate() {return hibernateTemplate;}@Resourcepublic void setHibernateTemplate(HibernateTemplate hibernateTemplate) {this.hibernateTemplate = hibernateTemplate;}public <T> List<T> getList(Class<T> t){System.out.println(this.getHibernateTemplate());List<T> list = this.getHibernateTemplate().find("from User");return list;}}
package cn.Test;//测试类import org.springframework.context.support.ClassPathXmlApplicationContext;import cn.DAO.DAO;import cn.Entity.User;public class Test {public static void main(String[] args) {ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");DAO dao = (DAO) context.getBean("DAO");//DAO dao = new DAO();实验2 dao.getList(User.class);//实验1 }}这里是beans.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-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"><context:annotation-config/><context:component-scan base-package="cn"/><bean id="mappings" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><property name="locations"><list><value>classpath:jdbc.properties</value><value>classpath:hibernate.properties</value></list> </property></bean><bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="${jdbc.driverClassName}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/></bean><bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"><property name="dataSource" ref="dataSource"/><property name="packagesToScan"><list><value>cn.Entity</value></list></property><property name="hibernateProperties"><props><prop key="hibernate.dialect">${hibernate.dialect}</prop><prop key="hibernate.show_sql">${hibernate.show_sql}</prop><prop key="hibernate.cache.provider_class">${hibernate.cache.provider_class}</prop><!-- <prop key="hibernate.connection.provider_class">${hibernate.connection.provider_class}</prop> --><prop key="hibernate.current_session_context_class">${hibernate.current_session_context_class}</prop></props></property></bean><bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate"><property name="sessionFactory" ref="sessionFactory"></property></bean></beans>
实验1的结果是:成功获得最后的数据
实验2的结果是:报NullPointer错误。这里lz想到学spring的时候,有看到 spring所有的类都是单例模式。
所以lz的猜想是:当项目跑起来,spring就会对需要注入对象的地方注入已经实例化后的类对象,ps:加了@Component的类,且是单例的。
而当我们自己用DAO dao = new DAO()方式实例化的时候,实例化的是第二个DAO对象,里面需要注入的,例如:HibernateTmplate对象,没有获得资源。
而且dao的构造函数,无论我定义为private或者public都会被调用。不是很懂getbean到底是怎么实例化对象。。。
之后我又做了一个线程的实验。
继承Thead的类,因为Spring的Scope默认是单例。但是可以加入@Scope(value=“prototype”)//多例 ;然后配上@Component就可以了
但是实现Runnable接口的类就可以@Component,可以通过getBean获取对象然后放入Thead中,实现多线程操作
这里再贴一个加上了c3p0连接池的spring的beans.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-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"><context:annotation-config/><context:component-scan base-package="cn"/><bean id="mappings" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><property name="locations"><list><value>classpath:jdbc.properties</value><value>classpath:hibernate.properties</value></list> </property></bean><!-- <bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="${jdbc.driverClassName}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/></bean> --><bean id="dataSource" destroy-method="close"class="com.mchange.v2.c3p0.ComboPooledDataSource"><property name="driverClass" value="${jdbc.driverClassName}"/><property name="jdbcUrl" value="${jdbc.url}"/><property name="user" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/><property name="acquireIncrement" value="${c3p0.acquireIncrement}"/><property name="initialPoolSize" value="${c3p0.initialPoolSize}"/><property name="maxIdleTime" value="${c3p0.maxIdleTime}"/><property name="minPoolSize" value="${c3p0.minPoolSize}"/><property name="maxPoolSize" value="${c3p0.maxPoolSize}"/></bean><bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"><property name="dataSource" ref="dataSource"/><property name="packagesToScan"><list><value>cn.Entity</value></list></property><property name="hibernateProperties"><props><prop key="hibernate.dialect">${hibernate.dialect}</prop><prop key="hibernate.show_sql">${hibernate.show_sql}</prop><prop key="hibernate.cache.provider_class">${hibernate.cache.provider_class}</prop><prop key="hibernate.connection.provider_class">${hibernate.connection.provider_class}</prop><prop key="hibernate.current_session_context_class">${hibernate.current_session_context_class}</prop></props></property></bean><bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate"><property name="sessionFactory" ref="sessionFactory"></property></bean></beans>
- Spring笔记+心得
- Spring 事务管理 随手笔记 心得
- Spring心得
- spring心得
- 心得笔记
- [心得] Effective Java心得笔记
- 解读spring源代码心得
- spring使用心得
- spring webMVC心得
- Spring事务心得
- Spring入门学习 心得
- Spring的一点心得
- Spring原理心得
- Spring RMI使用心得
- 解读spring源代码心得
- Java Spring C3P0心得
- spring事务管理使用心得
- spring rmi使用心得
- VS2010下Qt5.1.0安装到简单的第一个工程
- 老是忘记小说真郁闷
- 网购化妆品,2成是假货
- linux下如何动态加载动态库(loadlibrary)
- Oracle分析query plan
- Spring笔记+心得
- 【军事】蒸汽机、火炮及枪支之物理分析
- 苹果机顶盒年收入破10亿美元
- Cracking the coding interview--Q8.7
- uva 327 - Evaluating Simple C Expressions
- 黑马程序员 javaScript
- .NET 程序集 中创建CLR sqlServer函数 需要启用 "clr enabled" 配置选项
- 作业调度常见算法
- 1010. Zipper