Spring 基础知识

1.面向接口(抽象)编程的概念与好处(属于Spring的特性)
  好处:灵活,解耦

  Service(业务逻辑层)
  Dao(数据库访问层,屏蔽不同数据库的访问,接口类,不同的实现类可以注入)
  Bean(实体类)


2.Spring 的两个特性
  IOC/DI
  Inversion of control(控制反转)
  对象的创建,由Spring容器读取配置文件进行自动创建,而非自己写代码来进行创建。
  dependency injection(依赖注入)
  将对象的依赖,通过spring容器读取配置文件进行创建并注入。

  Spring的作用
  1.实例化具体bean
  2.动态装配



3.如何创建user library?
Windwos -> preferences -> User Libraries ->  New 
Windwos -> preferences -> User Libraries ->  Add JARs


4.Spring配置文件

<beans ... default-autowire="byName" default-lazy-init="true">
  <bean id="u" class="com.anker.dao.impl.UserDaoImpl"/>
  <bean id="userService" class="com.anker.service.UserService">
    <property name="userDAO" bean="u"/>            
  </bean>
</beans>

property属性是在Bean对象实例化后,才注入的。


default-autowire
自动装配:(指bean中的引用对象,自动在配置文件中寻找相同名字或者类型的bean进行注入)
包含两种:
byType 根据类型进行自动匹配
byName 根据名字自动匹配

default-lazy-init(默认为false)
Bean的生命周期:(每次类ClassPathXmlApplicationContext新建时,会自动创建所有的bean对象)
当设置为true,即意味着不自动创建bean对象, 当有用到此bean时,调用getBean方法时,才会创建


Scope
用于设置Bean的创建方式:
singleton:(单例,默认为单例)
prototype:(每次创建新对象)

property标签
用于设置注入bean对象中的引用对象

bean中可以设置(不常用)
init-method(初始化Bean时执行的方法,bean创建后执行的方法)
destroy-method (在Bean被销毁的时候,调用的方法。执行context.registerShutdownHook方法时会执行此指定的方法)。

initializingBean DisposableBean接口
当Bean类实现initializingBean接口,在bean被初始化时,spring容器自动调用afterPropertiesSet方法
在Bean类实现DisposableBean接口,在bean被摧毁时,Spring自动调用destroy方法。
作用,跟上面的xml文件配置是一样的。
afterPropertiesSet方法是在对象创建后调用的。


5.spring集合注入:
<bean>
<property name="sets">
<set>
  <value>1</value>
  <value>2</value>
</set>
</property>

<property name="lists">
<list>
  <value>1</value>
  <value>2</value>
  <value>3</value>
</list>
</property>

<property name="maps">
<map>
  <entry key="1" value="1"></entry>
  <entry key="2" value="2"></entry>
  <entry key="3" value="3"></entry>
</map>
</property>

</bean>

6.FactoryBean

针对对象的创建过程比较复杂,采用工厂类来创建。
在Spring中,只要类实现了FactoryBean接口,即为Bean工厂类,它实际上返回的对象为getObject()方法的返回。
通过工厂类,可以灵活的控制对象的初始化过程,根据不同情况创建不同的对象。

 public UserManager getObject() throws Exception {
        System.out.println("create UserManager region="+region);//创建其他对象前,可以提前获取前置条件的输入参数值
        UserManager re= new UserManager();
	if(region.equal("1"))
          re.setUserDao(userDao)
	else{
	  re.setUserDao(userDao2);
	};
        System.out.println(this.region);
        return re;
 }


7.PlaceHolder 占位符

占位符,将某些参数存放在配置文件中,然后读取配置文件进行获取。这样减少更改源代码的机会。
配置的方法:<context:property placeholder location="xxxx/conf.properties">

${region},当遇到此类占位符,将从配置的文件中寻找key为region的键值对,并将赋值。

8. BeanFactoryPostProcessor Bean类总工厂的后置处理器

Bean工厂的后置处理器,指在通过xml文件配置Bean之后,对Bean的创建方法可以进行修改、重新定义。(比如占位符的替换,其实就是后置处理器在起作用)。ye3w
需要继承BeanFactoryPostProcessor接口,然后在XML中像配置普通的Bean一样进行配置即可。
继承PriorityOrdered,指定权限数字,用于当多个Bean工程类总工厂执行的顺序

public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        BeanDefinition bd = beanFactory.getBeanDefinition("userManager"); //获取bean的定义
        MutablePropertyValues pv = bd.getPropertyValues();
        String oldValue = ((TypedStringValue) pv.getPropertyValue("region").getValue()).getValue();
        Object obj;
        if ("hz".equals(oldValue)) {		//根据设置的参数,注入不同的Dao对象
            obj = beanFactory.getBean("userDao1");
        } else {
            obj = beanFactory.getBean("userDao2"); //getBean时创建Bean对象
        }
        String newRegion = "{" + oldValue + "}";
        pv.addPropertyValue("region", newRegion); //增加注入参数值

        pv.addPropertyValue("userDao", obj); //增加注入对象
    }

9.BeanPostProcessor Bean接口切面

此接口可以实现对对象进行重新包装返回,比如对传递过来的类进行返回它的子类等。

类实现接口BeanPostProcessor即可,然后在xml文件中配置,既可以实现在Bean初始化方法前后进行添加内容。

此接口存在两个方法,Object postProcessBeforeInitialization(Object bean,String beanName)(第一个参数为实例化类的object,)
在类init-method方法之前,被调用,此时类已执行初始化方法。

Object postProcessAfterInitialization(Object bean,String beanName)
在类初始化之后,被调用。




10.AOP:

面向切面编程,是面向对象的思维方式的有力补充。
好处:可以动态的添加和删除切面上的逻辑而不影响原来的代码。 


11.如何调整Tomcat的内存设置
Tomcat的启动参数位于tomcat目录\bin,windows系统为catalina.bat文件
linux系统改为catalina.sh



windows添加内容:
set JAVA_OPTS= -server -Xms1024M -Xmx1024M -XX:PermSize=256M -XX:MaxNewSize=256M -XX:MaxPermSize=256M

-server: tomcat默认以-client模式启动,-server意味着更好的性能
-Xms:JVM堆内存初始值
-Xmx:JVM堆内存最大值
-Xmn:JVM堆内存最小值

-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64(内存4GB,4*1024/64 = 64MB)
-XX:MaxPermSize设置最大非堆内存的大小 默认是物理内存的1/4。
在数据量的很大的文件导出时,一定要把这两个值设置上,否则会出现内存溢出的错误。

Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。
堆是在 Java 虚拟机启动时创建的。
在JVM中堆之外的内存称为非堆内存(Non-heap memory)。
非堆就是JVM留给自己用的,
方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、
每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法的代码都在非堆内存中。 


12.web项目中,如何利用spring自动初始化bean对象


ContextLoaderListener的作用就是启动Web容器时,自动装配ApplicationContext的配置信息
<listener>
	<listener-class>
	org.springframework.web.context.ContextLoaderListener
	</listener-class>
</listener>

默认的路径是"/WEB-INF/applicationContext.xml,
如果是要自定义文件名可以在web.xml里加入contextConfigLocation这个context参数
<context-param>
	<param-name>contextConfigLocation</param-name>
	<param-value>classpath:/DefaultContext.xml</param-value>
</context-param>

13.eache缓存框架的使用

EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider。

使用指定配置文件创建  
CacheManager manager = CacheManager.create("src/config/ehcache.xml");  

取得配置文件中预先 定义的sampleCache1设置,生成一个Cache  
Cache cache = manager.getCache("sampleCache1");  

删除cache  
CacheManager singletonManager = CacheManager.create(); 
singletonManager.removeCache("sampleCache1");    

3.使用Caches  
(1)往cache中加入元素  
Element element = new Element("key1", "value1");  
cache.put(new Element(element);  
(2)从cache中取得元素  
Element element = cache.get("key1");   
(3)从cache中删除元素  
Cache cache = manager.getCache("sampleCache1");
Element element = new Element("key1", "value1");
cache.remove("key1");  

3.卸载CacheManager ,
关闭Cache manager.shutdown();

所以大概步骤为: 
第一步:生成CacheManager对象 
第二步:生成Cache对象 
第三步:向Cache对象里添加由key,value组成的键值对的Element元素 



ehcache.xml是ehcache的配置文件,并且存放在应用的classpath中。
下面是对该XML文件中的一些元素及其属性的相关说明:  

<diskStore>元素:指定一个文件目录,
当EHCache把数据写到硬盘上时,将把数据写到这个文件目录下。 
<defaultCache> : 默认cache
maxElementsInMemory: 缓存对象的最大数
eternal: 如果为true,表示对象永远不会过期,此时会忽略timeToIdleSeconds和timeToLiveSeconds属性,默认为false;
timeToIdleSeconds:  设定允许对象处于空闲状态的最长时间,超过这个时间,EHCache即把它从内存中清除。
timeToLiveSeconds:   设定允许对象存在于缓存中的最长时间。
overflowToDisk: 如果为true,表示当基于内存的缓存中的对象数目达到了 maxElementsInMemory界限后,
会把益出的对象写到基于硬盘的缓存中。注意:如果缓存的对象要写入到硬盘中的话,则该对象必须实现了Serializable接口才行。

猜你喜欢

转载自yangeoo.iteye.com/blog/2199258