近期项目要求Spring零配置,采用Java配置。总结出一些用到的注解~~
1.@Configuration和@Bean搭配使用
用@Configuration注解该类,等价与XML中配置beans;用@Bean标注方法等价于XML中配置bean。
实例:
package com.sitech.ddoe.server.all.config;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Iterator;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSource;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.dom4j.tree.AbstractAttribute;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
import com.sitech.ddoe.comm.common.HeartBeatConfig;
import com.sitech.ddoe.comm.server.core.ServerConfig;
/**
* 从server.xml中读取配置信息
*
* @author zhaojing_bcc
*
*/
@Configuration
public class ServerReader {
private DataSource dataSource;
public Logger logger = LoggerFactory.getLogger(getClass());
@PostConstruct
public void init() {
File xmlFile = new File("src/main/resources/server.xml");
FileInputStream fis = null;
try {
fis = new FileInputStream(xmlFile);
} catch (FileNotFoundException e) {
logger.debug("File is not exsit!");
e.printStackTrace();
}
SAXReader saxReader = new SAXReader();
try {
// 生成文档对应实体
Document doc = saxReader.read(fis);
// 获取指定路径下的元素列表,这里指获取所有的data下的row元素
Element root = doc.getRootElement();
Iterator iterator = root.elementIterator();
while (iterator.hasNext()) {
// 标签转换成元素对象
Element ele = (Element) iterator.next();
// 获取元素的名字
String elementName = ele.getName();
switch (elementName) {
case "ServerConfig":
handlerServerConfig(ele.attributes());
break;
case "Datasource":
handlerDatasource(ele.attributes());
break;
case "HeartBeat":
handlerHeartBeat(ele.attributes());
break;
default:
break;
}
}
} catch (DocumentException e) {
logger.debug("parse xml error!");
e.printStackTrace();
}
}
/**
* 装配HeartBeatConfig
*
* @param attributes
* @return HeartBeatConfig
*/
@Bean
public HeartBeatConfig handlerHeartBeat(List elementList) {
Integer heartbeatSeconds = null;
Integer channelReadIdleSeconds = null;
for (Iterator it = elementList.iterator(); it.hasNext();) {
// 将每个属性转化为一个抽象属性,然后获取其名字和值
AbstractAttribute aa = (AbstractAttribute) it.next();
String name = aa.getName();
String value = aa.getValue();
switch (name) {
case "heartbeatSeconds":
heartbeatSeconds = Integer.valueOf(value);
break;
case "channelReadIdleSeconds":
channelReadIdleSeconds = Integer.valueOf(value);
break;
default:
throw new RuntimeException(name + "is error property");
}
}
return new HeartBeatConfig(heartbeatSeconds, channelReadIdleSeconds);
}
/**
* 装配ServerConfig
*
* @param elementList
* @return ServerConfig
*/
@Bean
public ServerConfig handlerServerConfig(List elementList) {
Integer port = null;
Integer businessThreadNum = null;
Integer nioThreadNum = null;
for (Iterator it = elementList.iterator(); it.hasNext();) {
// 将每个属性转化为一个抽象属性,然后获取其名字和值
AbstractAttribute aa = (AbstractAttribute) it.next();
String name = aa.getName();
String value = aa.getValue();
switch (name) {
case "port":
port = Integer.valueOf(value);
break;
case "businessThreadNum":
businessThreadNum = Integer.valueOf(value);
break;
case "nioThreadNum":
nioThreadNum = Integer.valueOf(value);
break;
default:
throw new RuntimeException(name + "is error property");
}
}
return new ServerConfig(port, businessThreadNum, nioThreadNum);
}
/**
* 装配DataSource
*
* @param elementList
* @return DataSource
*/
@Bean
public DataSource handlerDatasource(List elementList) {
BasicDataSource dataSource = new BasicDataSource();
for (Iterator it = elementList.iterator(); it.hasNext();) {
// 将每个属性转化为一个抽象属性,然后获取其名字和值
AbstractAttribute aa = (AbstractAttribute) it.next();
String name = aa.getName();
String value = aa.getValue();
switch (name) {
case "driverClassName":
dataSource.setDriverClassName(value);
break;
case "url":
dataSource.setUrl(value);
break;
case "username":
dataSource.setUsername(value);
break;
case "password":
dataSource.setPassword(value);
break;
case "defaultAutoCommit":
dataSource.setDefaultAutoCommit(Boolean.valueOf(value));
break;
case "defaultReadOnly":
dataSource.setDefaultReadOnly(Boolean.valueOf(value));
break;
case "maxActive":
dataSource.setMaxActive(Integer.valueOf(value));
break;
case "maxIdle":
dataSource.setMaxIdle(Integer.valueOf(value));
break;
case "maxWait":
dataSource.setMaxWait(Integer.valueOf(value));
break;
case "initialSize":
dataSource.setInitialSize(Integer.valueOf(value));
break;
default:
break;
}
}
this.dataSource = dataSource;
return dataSource;
}
/**
* 装配JdbcTemplate
*
* @return JdbcTemplate
*/
@Bean
public JdbcTemplate jdbcTemplate() {
return new JdbcTemplate(dataSource);
}
}
2.main函数启动项目
public class Run {
public static void main(String[] args) {
ApplicationContext annotationContext = new AnnotationConfigApplicationContext("com.sitech.ddoe");
NettyServer n = annotationContext.getBean("nettyServer", NettyServer.class);// 创建bean的引用对象
n.start();
}
}
3.参考: