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>



0 0