当前位置: 首页 > 编程日记 > 正文

Spring 实践 -IoC

Spring 实践

标签: Java与设计模式


Spring简介

Spring是分层的JavaSE/EE Full-Stack轻量级开源框架.以IoC(Inverse of Control 控制反转)和AOP(Aspect Oriented Programming 面向切面编程)为内核, 取代EJB的臃肿/低效/脱离现实.
主页http://spring.io/
此处输入图片的描述

IoC与DI

  • IOC: 即控制反转, 解决程序对象紧密耦合问题(方式: 工厂+反射+配置文件), 将程序中原来构造对象的操作,交给IoC容器, 当程序真正需要对象时,再找IoC容器获取.
  • DI: 即依赖注入, IoC容器需要为程序提供依赖对象,而所依赖的对象又依赖于其他对象,因此可以一次获取该对象所依赖的所有对象(如Controller依赖于Service, Service依赖于DAO, 因此Controller找Ioc容器获取Service, 当IoC容器提供Service的同时,DAO也同时注入到Service中)

    详细可参考: IoC框架(依赖注入 DI)

Spring

  • 方便解耦,简化开发
    Spring就是一个大工厂,可将所有对象创建依赖关系的维护交给Spring管理;
  • AOP支持
    Spring支持面向切面编程,可以方便的实现对程序进行权限拦截/运行监控/缓存实现等功能;
  • 声明式事务管理
    只需通过配置就可完成对事务的管理,而无需手动编程;
  • 方便程序的测试
    Spring提供对Junit4支持,通过注解方便测试Spring程序;
  • 集成各种优秀框架
    Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:MyBatis/iBatis/Hibernate等)的直接支持;
  • 降低JavaEE API的使用难度
    Spring对JavaEE开发的一些API(如JDBC/JavaMail/远程调用等)提供了封装,大大降低API使用难度;

初识Spring

需求- 模拟用户注册过程:

  • Spring依赖
    进行Spring的IoC/DI开发,只需要导入Spring最核心依赖:core/beans/context/expression,为了看到DEBUG信息,我们还可以加上commons-logging, 而junit, 则是做单元测试必备的:
<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>4.2.0.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>4.2.0.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>4.2.0.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-expression</artifactId><version>4.2.0.RELEASE</version></dependency><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version></dependency>
</dependencies>
  • Controller
/*** Created by jifang on 15/12/5.*/
public class UserController {/*** 依赖注入(DI): 在Spring构造UserController对象时, 可以同时将构造好的UserService对象注入(下同)*/private IUserService userService;public IUserService getUserService() {return userService;}public void setUserService(IUserService userService) {this.userService = userService;}public void register(String userName, String password) {System.out.println("用户: " + userName + " 进行注册...");userService.register(userName, password);}
}
  • Service
public interface IUserService {void register(String userName, String password);
}
public class UserServiceImpl implements IUserService {private IUserDao userDao;public IUserDao getUserDao() {return userDao;}public void setUserDao(IUserDao userDao) {this.userDao = userDao;}@Overridepublic void register(String userName, String password) {System.out.println("用户: " + userName + " 进行注册...");userDao.add(userName, passProcess(password));}// 对密码进行加密处理private String passProcess(String password) {System.out.println("密码: " + password + "加密处理...");return password;}
}
  • DAO
public interface IUserDao {void add(String userName, String password);
}
public class UserDaoImpl implements IUserDao {@Overridepublic void add(String userName, String password) {System.out.println("用户: " + userName + ", 密码: " + password + " 加入数据库");}
}
  • 配置Bean
<?xml version="1.0" encoding="UTF-8"?>
<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.xsd"><bean id="userDao" class="com.fq.first.dao.impl.UserDaoImpl"></bean><bean id="userService" class="com.fq.first.service.impl.UserServiceImpl"><property name="userDao" ref="userDao"></property></bean><bean id="userController" class="com.fq.first.controller.UserController"><property name="userService" ref="userService"></property></bean></beans>
  • 测试
/*** Created by jifang on 15/12/5.*/
public class UserControllerTest extends TestCase {/*** 加载Spring容器*/private ApplicationContext context;@Beforepublic void setUp() throws Exception {context = new ClassPathXmlApplicationContext("spring/applicationContext.xml");}@Testpublic void testRegister() throws Exception {UserController controller = context.getBean("userController", UserController.class);controller.register("翡青", "123");}
}
  1. 在程序中通过ApplicationContext接口加载Spring容器, 获取Spring工厂对象
    • ClassPathXmlApplicationContext //读取src下配置文件
    • FileSystemXmlApplicationContext //读取WEB-INF下配置文件
  2. Spring对象工厂- BeanFactory与ApplicationContext:
    • ApplicationContextBeanFactory的子接口,BeanFactory是Spring最核心工厂接口。
    • ApplicationContext提供更多功能(如国际化处理/自动装配Bean/不同应用层的Context实现)
    • ApplicationContext会在容器初始化时对其中管理Bean对象进行创建,BeanFactory会在对象获取时才进行初始化.

XML装配

Spring提供了两种装配Bean的方式, XML与注解,其中XML方式Spring支持较早,现在在配置一些不是自己写的Bean时(如数据库连接池等从Jar包种引入的Bean)时是非常有用,而注解方式则常用于装配自己写的Bean.


三种实例化Bean的方式

  • 构造器实例化
<!--使用构造器(默认无参)构造对象-->
<bean id="constructBean" class="com.fq.instance.ConstructBean">
</bean>
  • 静态工厂的静态方法实例化
<!--使用静态工厂构造对象, 注: class应为工厂类-->
<bean id="staticBean" class="com.fq.instance.StaticBeanFactory" factory-method="getInstance">
</bean>
  • 实例工厂的实例方法实例化
<!--使用实例工厂构造对象, 注: 要先实例化工厂-->
<bean id="beanFactory" class="com.fq.instance.InstanceBeanFactory">
</bean>
<!-- 再通过工厂对象的实例方法,构造目标对象 -->
<bean id="instanceBean" factory-bean="beanFactory" factory-method="getInstance">
</bean>

Bean作用域

类别说明
singleton在容器中仅存在一个实例(单例模式)
prototype每次从容器中获取都返回一个新的实例,即每次调用getBean()时,都执行一次构造方法(lazy,原型模式)
request每次HTTP请求都会创建一个新的Bean,该作用域仅适用于WebApplicationContext环境(不常用)
session同一个Session共享一个Bean,仅适用于WebApplicationContext环境(不常用)
globalSession一般用于Porlet应用环境,该作用域仅适用于WebApplicationContext环境(不常用)
  • scope
<!--Spring使用scope标签来制定bean的作用域(默认为Singleton)-->
<bean id="singletonBean" class="com.fq.instance.SingletonBean" scope="singleton">
</bean>
<bean id="prototypeBean" class="com.fq.instance.PrototypeBean" scope="prototype">
</bean>

Bean生命周期

Spring初始化/销毁bean时, 有时需要作一些处理工作, 因此Spring可以在创建和销毁bean的时候调用bean的两个生命周期方法;

/*** Created by jifang on 15/12/6.*/
public class LifecycleBean {public LifecycleBean() {System.out.println("Constructor ...");}/*** 声明周期方法需: 无参, 无返回值, 非static*/public void setUp() {System.out.println("SetUp ...");}/*** 同上*/public void tearDown() {System.out.println("TearDown ...");}
}
  • 配置:
<!-- init-method属性配置初始化方法,destroy-method属性配置销毁方法-->
<bean id="lifecycleBean" class="com.fq.bean.LifecycleBean" init-method="setUp" destroy-method="tearDown">
</bean>
  • 测试
/*** Created by jifang on 15/12/6.*/
public class LifecycleBeanTest extends TestCase {private ClassPathXmlApplicationContext context;@Beforepublic void setUp() throws Exception {context = new ClassPathXmlApplicationContext("spring/applicationContext.xml");}@Testpublic void testLifecycle(){LifecycleBean bean = context.getBean("lifecycleBean", LifecycleBean.class);System.out.println(bean);}@Afterpublic void tearDown() throws Exception {// 必须手动调用context的close方法, 才会执行bean的销毁方法context.close();}
}

初始化方法与构造方法的区别?
1) 构造方法为对象申请空间, 完成对象基本属性的初始化;
2) 初始化方法主要完成对象复杂构造过程;
3) Java建议将对象复杂构造过程单独抽取出初始化方法, 如javax.servlet.GenericServlet
init方法

public void init(ServletConfig config) throws ServletException {this.config = config;this.init();
}

后处理器

Spring提供了BeanPostProcessor接口,在构造Bean对象执行对象初始化(init-method)方法时可以对Bean进行处理;

/*** Created by jifang on 15/12/6.*/
public class PrintBeanProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {// 可以根据beanName来决定对那个Bean进行后处理操作if (beanName.equals("lifecycleBean")) {System.out.println("后处理bean -- process before ...");}return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {// 如果不制定beanName, 则默认处理所有BeanSystem.out.println("后处理bean -- process after ...");return bean;}
}
  • 配置
<!-- 为Spring容器所用的bean, 不需配置id -->
<bean class="com.fq.processor.PrintBeanProcessor"></bean>

这样在执行init-method[setUp]的前后, 会分别执行BeanPostProcessor中的两个方法.

后处理器可以在对象构造过程中提供代理,这是AOP自动代理的核心.


XML依赖注入

Spring配置文件支持构造参数属性注入和Setter方法属性注入;

1. 构造参数注入

<bean id="bean" class="com.fq.di.Bean"><!--index   代表参数顺序(从0开始)name    代表参数名type    参数类型value   注入的参数值ref     引用另一个bean元素的id--><constructor-arg index="0" type="java.lang.String" value="fei_qing"></constructor-arg><constructor-arg index="1" type="java.lang.Double" value="3.14"></constructor-arg>
</bean>

2. Setter方法注入

<bean id="bean" class="com.fq.di.Bean"><!--name    属性名(congSetter方法获得)value   注入的参数值ref     引用的另一个bean的id--><property name="name" value="fei_qing"></property><property name="price" value="88.8"></property>
</bean>

3. p名称空间注入

P名称空间在spring2.5版本后引入, 目的是为了简化属性依赖注入(setter方法)

<!--p:属性名="XXX", 引入常量值p:属性名-ref="XXX", 引用其他Bean对象
-->
<bean id="bean" class="com.fq.di.Bean" p:name="feiqing" p:price="1188">
</bean>

4. SpEL表达式

在spring3.0之后,引入SpEL表达式,以简化属性注入.

#{表达式}, 通过value属性注入: 可以引用一个Bean对象/对象属性/对象方法… 详细可参考Spring 表达式语言(SpEL)

  • Bean
public class Car {private String logo;private double price;private String owner;public String getLogo() {return logo;}public void setLogo(String logo) {this.logo = logo;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}public String getOwner() {return owner;}public void setOwner(String owner) {this.owner = owner;}
}
public class Employ {private String name;private Car car;public String getName() {return name;}public void setName(String name) {this.name = name;}public Car getCar() {return car;}public void setCar(Car car) {this.car = car;}
}
  • 配置
<!--SpEL 使用#{}来引用/获取对象-->
<bean id="car" class="com.fq.di.Car"><property name="logo" value="#{'logo.pic'}"/><property name="price" value="#{18.8}"/><property name="owner" value="#{'feiqing'}"/>
</bean><bean id="employ" class="com.fq.di.Employ"><!-- 可以直接使用value来引用到对象, 而不是ref --><property name="car" value="#{car}"/><!-- 可以直接引用一个对象的属性 --><!--<property name="name" value="#{car.owner}"/>--><!-- 还可以直接调用对象的方法 --><property name="name" value="#{car.getOwner().toUpperCase()}"/>
</bean>

4. 集合属性注入

java常见集合: List/Set/Map/Properties等, Spring为每种集合都提供一个标签进行注入;

  • Bean
public class CollectionBean {private List<String> list;private Set<String> set;private Map<String, String> map;private Properties properties;public List<String> getList() {return list;}public void setList(List<String> list) {this.list = list;}public Set<String> getSet() {return set;}public void setSet(Set<String> set) {this.set = set;}public Map<String, String> getMap() {return map;}public void setMap(Map<String, String> map) {this.map = map;}public Properties getProperties() {return properties;}public void setProperties(Properties properties) {this.properties = properties;}
}
  • 配置
<bean id="collectionBean" class="com.fq.di.CollectionBean"><property name="list"><list><value>aa</value><value>bb</value><value>cc</value><value>dd</value></list></property><property name="set"><set><value>11</value><value>12</value><value>11</value></set></property><property name="map"><map><entry key="key1" value="value1"/><entry key="key2" value="value2"/></map></property><property name="properties"><props><prop key="key1">value_1</prop><prop key="key2">value_2</prop></props></property>
</bean>

注解装配

注解配置Bean

  • 在需要Spring管理的类上添加@Component注解
    (@Component还可以指定组件名@Component(value = "xxx"))
@Component
public class Bean {private String name;private Double price;public Bean() {}public Bean(String name, Double price) {this.name = name;this.price = price;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Double getPrice() {return price;}public void setPrice(Double price) {this.price = price;}
}
  • 引入context命名空间并批量扫描
<?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"><context:component-scan base-package="com.fq.di"/>
</beans>

Spring细化@Component以细分组件功能,提供了以下三个等价注解:

注解说明
@Controller控制器,web层组件
@Service业务类,业务层组件
@Repository持久层组件

Bean作用域

通过@Scope注解指定作用域

@Component
@Scope("prototype")
public class Bean {// ...
}

Bean生命周期

@PostConstruct初始化
@PreDestroy销毁
  • Bean
public class Bean {@PostConstructpublic void setUp(){System.out.println("setUp ...");}@PreDestroypublic void tearDown(){System.out.println("tearDown ...");}
}

注解依赖注入

1. @Value

  • 简单类型
@Component
public class Bean {@Value("feiqing")private String name;@Value("88.88")private Double price;// ....
}
  • 复杂属性(使用SpEL表达式)
@Component
public class Bean {@Value("#{car}")private Car car;// ...
}

2. @Autowired

  • @Autowired 默认按照类型进行注入(如果容器中存在两个相同类型对象,则@Autowired无法注入)
@Component
public class Bean {@Autowiredprivate Car car;// ....
}
  • @Autowired+@Qualifier指定注入Bean的id
@Component
public class Bean {@Autowired@Qualifier("car")private Car car;// ...
}

3. @Resource

Spring支持JSR-250规范,可以使用@Resource()进行属性注入,功能和@Autowired相同:

@Controller(value = "bean")
public class Bean {@Resource(name = "car")private Car car;//...
}

注解/XML混合

Bean定义使用XML,Bean关系依赖注入使用注解:

需要在applicationContext.xml中配置:

<context:annotation-config/>

该配置可以使@Resource@PostConstruct@PreDestroy@Autowired注解生效.

如果在配置文件中使用了<context:component-scan base-package="xxx.xx"/>则具有了<context:annotation-config/>的效果, 不必再单独配置.


转载于:https://www.cnblogs.com/itrena/p/5926901.html

相关文章:

大话编程(一)

2013年1月15日 11:40:38 还有20分钟下班,实在忍不住了,想说点儿什么 编程入门的可以看看 (一)什么是0什么是1 有那么一堆叫半导体的东西,某个牛逼人用铜线连起来,组成了一个电路. 这个电路在一直通电的情况下,可以使某个点的电压保持不变, 如果这个点的电压大于某个值,就抽象为…

php 保存表单数据,使用jquery和php自动保存表单数据

我对PHP非常好,但是使用jQuery的总菜单,并且卡在自动保存表单数据中.自动保存功能在dummy.php中每30秒调用一次.我正在将用于处理的序列化表单数据( – >数据库)发送到savetest.php.此刻,我坚持这个问题&#xff1a;如何让savetest.php“监听”传入的数据并对其作出反应&…

Finalize/Dispose/Destructor

我总是会搞混这些东西&#xff0c;还是写下来帮助记忆。 Finalize 即Object.Finalize()&#xff0c;C#中不允许使用Finalize&#xff0c;析构器就等价于Finalize。 Destructor 析构器&#xff08;Destructor&#xff09;是在对象没有被引用的时候&#xff0c;由CLR自动调用的。…

linux 串口minicom配置使用

在minicom -s配置是记得取消硬件流控制。 1.minicom -o 配置文件 2.alias comminicom -o 配置文件 转载于:https://www.cnblogs.com/niceskyfly/p/5257713.html

POJ-1185 炮兵阵地 动态规划+状态压缩

由于递推的时候依赖于三个连续层的关系.一开始想着直接三重for循环,但是这里有个问题就是上一层的0位置上包括着上上层是0和1两种可能,而后者又对当前行有约束,因此该方法不行.当然有一个办法就是增加状态数,让状态能够表示是从1还是从0转移过来的.(这题有个解法是采用多进制的…

php字符串转换表达式,php处理字符串格式的计算表达式

有时候我们对每一种产品都有一个提成公式&#xff0c;而这个计算提成的公式是以字符串格式存在表中的当我们用这个计算公式时&#xff0c;他并不像我们写的&#xff1a;$a23*5;这样简单的能计算出结果&#xff0c;而它是个字符串所以&#xff0c;我们就必须把字符串转化为我们能…

JS函数式编程【译】5.2 函子 (Functors)

函子&#xff08;Functors&#xff09; 态射是类型之间的映射&#xff1b;函子是范畴之间的映射。可以认为函子是这样一个函数&#xff0c;它从一个容器中取出值&#xff0c; 并将其加工&#xff0c;然后放到一个新的容器中。这个函数的第一个输入的参数是类型的态射&#xff0…

[转]Introduction of iSCSI Target in Windows Server 2012

Introduction of iSCSI Target in Windows Server 2012 源地址&#xff1a;http://blogs.technet.com/b/filecab/archive/2012/05/21/introduction-of-iscsi-target-in-windows-server-2012.aspx The iSCSI Target made its debut as a free download for Windows 2008 R2 in A…

全国移动联通基站数据升级包(2013年1月基站升级包).rar

“全国移动联通基站数据升级包(2013年1月基站升级包).rar” 已经上传到CNBLOGS 地址&#xff1a;http://files.cnblogs.com/topwang-com/%E5%85%A8%E5%9B%BD%E7%A7%BB%E5%8A%A8%E8%81%94%E9%80%9A%E5%9F%BA%E7%AB%99%E6%95%B0%E6%8D%AE%E5%8D%87%E7%BA%A7%E5%8C%85(2013%E5%B9%…

php自动计算增长率,如何写sql计算增长率?

问题已有数据表(假定表名为t)time sale1999 4844904672000 651413668.92001 13713710082002 18177416252003 25053320952004 37654384862005 48177203842006 6083322598需要产生如下的数据表time sale …

我先了解一下博客园创建随笔/文章/日记的过程与三者的区别(隐私等级,是否审核等)...

我先了解一下博客园创建随笔/文章/日记的过程与三者的区别(隐私等级,是否审核等)转载于:https://www.cnblogs.com/Totooria-Hyperion/p/5260289.html

构建Java并发模型框架

2002 年 2 月 22 日 Java的多线程特性为构建高性能的应用提供了极大的方便&#xff0c;但是也带来了不少的麻烦。线程间同步、数据一致性等烦琐的问题需要细心的考虑&#xff0c;一不小心就会出现一些微妙的&#xff0c;难以调试的错误。另外&#xff0c;应用逻辑和线程逻辑纠缠…

Unity Note 1

1.把开始时间设定到播放完成的时间点&#xff0c;作为倒放的起点 animation["clip"].timeanimation["clip"].clip.length; animation["clip"].speed-1; animation.Play("clip"); 2.寻找场景中物体var door GameObject.Find(…

基于matlab的硅晶体模型,基于Matlab的图像处理技术识别硅太阳电池的缺陷

第 44 卷 第 7 期  2010 年 7 月 上 海 交 通 大 学 学 报 JOURNAL OF SHANGHAI J IAOTON G UNIVERSITY Vol. 44 No. 7   Jul. 2010   收稿日期 :20090908 作者简介 :柳效辉(19852) ,男 ,江西九江人 ,硕士生 ,主要从事光伏检测与光伏系统方面的研究. 徐  林(联系人) ,男 ,副…

spark- PySparkSQL之PySpark解析Json集合数据

PySparkSQL之PySpark解析Json集合数据 数据样本 12341234123412342|asefr-3423|[{"name":"spark","score":"65"},{"name":"airlow","score":"70"},{"name":"flume",&quo…

cmd库的导入Java,在cmd命令窗口导入第三方jar包来运行java文件

在cmd命令窗口导入第三方jar包来运行java文件&#xff0c;以下测试都是基于window环境&#xff0c;Linux环境没有测试。1、编译使用命令javac -cp或者javac -classpath本机测试&#xff1a;如下图所示&#xff0c;java文件路径为D:\workspace\demo,StringUtilsTest.java依赖了第…

JQuery 动态创建表单,并自动提交

前言&#xff1a;写这个是为了实现使用cookie进行自动登录的功能&#xff0c; 下面的代码是一个元素一个元素进行创建和赋值的&#xff0c; (可以尝试下将所有的html代码(form、input&#xff09;全部拼好以后放到${ } 中&#xff0c;再进行提交。) submit的时候注意下写法&…

(转)利用ArcScene进行三维地形模拟

本文摘自&#xff1a;http://www.sunzx.net/archive/1109.html 在ArcGIS Desktop中&#xff0c;可用于三维场景展示的程序为ArcGlobe和ArcScene&#xff0c;由于两者的差别&#xff0c;在三维场景展示中适用的情况有所不同。ArcScene是一个适合于展示三维透视场景的平台&#x…

Android使用自定义View时:Error inflating class错误的原因。

当在布局文件里使用自定义的View的时候&#xff0c;出现Error inflating class错误的原因&#xff1a; 1、没有定义inflate需要的默认构造函数&#xff1b; eg:自定义View为TestView,需要定义TestView(Context context),TestView(Context context,AttributeSet set); 2、这是个…

oracle的表几种连接比较,几种表连接方式的使用场景

1)nested loopnested loop&#xff0c;指的是两个表连接时, 通过两层嵌套循环来进行依次的匹配, 最后得到返回结果集的表连接方法.select t1.owner,t1.object_name,t2.OBJECT_IDfrom test_tab1 t1,test_tab2 t2where t1.OBJECT_ID t2.OBJECT_IDand ROWNUM select *from test_t…

Ajax 完整教程 (转)

Ajax 完整教程第 1 页 Ajax 简介Ajax 由 HTML、JavaScript™ 技术、DHTML 和 DOM 组成&#xff0c;这一杰出的方法可以将笨拙的 Web 界面转化成交互性的 Ajax 应用程序。本文的作者是一位 Ajax 专家&#xff0c;他演示了这些技术如何协同工作 —— 从总体概述到细节的讨论 ——…

.Net中如何操作IIS(源代码)

http://www.daima.com.cn/Info/3/Info20453/转载于:https://www.cnblogs.com/luoyuan/archive/2005/09/17/238986.html

Enterprise Library Configuration DAAB的使用

1.要试用DAAB,首先要引用两个类库 第一个是Enterprise Library Shared Library 这个类库是所有Enterprist Library都必须引用的类库,它提供所需的结构类型. 第二个是Enterprist Library Data Access Application Block 这个就是daab的核心类库. 2试用DAAB的第一个步骤就是配置a…

安装oracle后在cmd,在WINDOWS上安装ORACLE RAC的注意事项

在WINDOWS上安装ORACLE RAC的注意事项1、检查防火墙和杀毒软件如果不关掉防火墙&#xff0c;在安装CRS时&#xff0c;在"Oracle Clusterware Configuration Assistant"界面会提示(1)OUI-25031错误(2)dddb1 service OracleCSService in improper PENDING state, err(9…

Tessellation (曲面细分) Displacement Mapping (贴图置换)

DirectX 11 Tessellation (曲面细分)—什么是 Tessellation (曲面细分) ?它为什么可以起到如此关键的数据?随着近期人们对 DirectX 11 的议论纷纷&#xff0c;你可能已经听说了有关 DirectX 11 最大新特性 Tessellation (曲面细分) 的大量介绍。作为一个概念。 Tessellation …

java 第12课

/*Java是面向对象的程序设计语言.面向对象的思想是将客观事物都作为实体,而对象通过实体抽象得到.所谓实体抽象,就是对实体的某些特征进行概括,使其数字化、符号化;比如:李四同学,就是一个实体,我们关心他的这些特征:姓名、性别、年龄、身高、体重等特征,就会有李四、男、21、1…

鸽巢原理(The Pigeonhole Principle)(抽屉原理)

简单形式&#xff1a;若n1个物体放进n个盒子&#xff0c;那么至少有一个盒子包含两个或更多的物体。 应用&#xff1a;给定m个整数A1,A2,...,Am,存在整数k和l&#xff0c; 0 < k < l < m,使得Ak1 Ak2 &#xff0b; ... Al能够被m整除。即在A1&#xff0c;A2&…

oracle10g删除asm组,Oracle 10G RAC 删除已有节点

如果现在在RAC集群中有三个节点c1、c2、c3&#xff1a;如果想要卸载c3节点。1、在c1或者c2上删除c3实例运行dbca然后选择Oracle Real Application Clusters database选择Instance Management选择Delete an instance选择实例&#xff0c;填写用户名密码&#xff0c;Next选择c3: …

嵌入式linux学习笔记1—内存管理MMU之虚拟地址到物理地址的转化

一.内存管理基本知识 1.S3C2440最多会用到两级页表&#xff1a;以段的方式进行转换时只用到一级页表&#xff0c;以页的方式进行转换时用到两级页表。页的大小有三种&#xff1a;大页&#xff08;64KB&#xff09;&#xff0c;小页&#xff08;4KB&#xff09;&#xff0c;极小…

C# 最快的逐一打印斐波那契结果数列的算法

用这种方法就无需将数列中的每一个元素都计算一遍了&#xff01; 说多无谓&#xff0c;直接上代码吧&#xff01; private void button5_Click(object sender, EventArgs e) { FiBoNaQi f new FiBoNaQi(); f.numberToCount (Int16)numericUpDown1.Value; f.DoFiB…