spring中定义一个Bean以及生成一个Bean实例,具体
本文内容纲要:
- 1.基于xml文件定义:- 2.通过@Component@Configuration注解来定义
Bean配置有三种方法:
- 基于xml配置Bean
- 使用注解定义Bean
- 基于java类提供Bean定义信息
一个Bean的类结构:
/* Bean Id */ private String id;
/* Bean Class */
private String type;
/* Bean Property */ 属性
private Map<String, Object> properties = new HashMap<String, Object>();
Spring 就开始加载我们的配置文件了,将我们配置的信息保存在一个HashMap中,HashMap的key就是Bean 的 Id ,HasMap 的value是这个Bean,包括会扫描属性并保存到properties中。
1.基于xml文件定义:
使用:
//主类public static void main(String[] args) {
ApplicationContext context = new FileSystemXmlApplicationContext(
"applicationContext.xml");
Animal animal = (Animal) context.getBean("animal");
animal.say();
}
//Cat类
public class Cat implements Animal {
private String name;
public void say() {
System.out.println("I am " + name + "!");
}
public void setName(String name) {
this.name = name;
}
}
application.xml配置文件:
<bean id="animal" class="phz.springframework.test.Cat"> <property name="name" value="kitty" />
</bean>
通过反射创建类对象
public static Object newInstance(String className) { Class<?> cls = null;
Object obj = null;
try {
cls = Class.forName(className);
obj = cls.newInstance();
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
} catch (InstantiationException e) {
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
return obj;
}
通过下面这个方法获取每个属性的setter方法来进行注入
public static void setProperty(Object obj, String name, String value) { Class<? extends Object> clazz = obj.getClass();
try {
String methodName = returnSetMthodName(name);//获取这个属性的setter方法
Method[] ms = clazz.getMethods();
for (Method m : ms) {
if (m.getName().equals(methodName)) {
if (m.getParameterTypes().length == 1) {
Class<?> clazzParameterType = m.getParameterTypes()[0];
setFieldValue(clazzParameterType.getName(), value, m,
obj);
break;
}
}
}
} catch (SecurityException e) {
throw new RuntimeException(e);
} catch (IllegalArgumentException e) {
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
} catch (InvocationTargetException e) {
throw new RuntimeException(e);
}
}
2.通过@Component@Configuration注解来定义
@Component
@Component("userDao")public class UserDao {}
除了@Component以外,Spring提供了3个功能基本和@Component等效的注解,它们分别用于对DAO、Service及Web层的Controller进行注解,所以也称这些注解为Bean的衍型注解:(类似于xml文件中定义Bean
- @Repository:用于对DAO实现类进行标注;
- @Service:用于对Service实现类进行标注;
- @Controller:用于对Controller实现类进行标注;
之所以要在@Component之外提供这三个特殊的注解,是为了让注解类本身的用途清晰化。
@Configuration
普通的POJO类中只要标注@Configuration注解,就可以为spring容器提供Bean定义的信息了,每个标注了@Bean的类方法都相当于提供了一个Bean的定义信息。
//①将一个POJO标注为定义Bean的配置类@Configuration
public class AppConf {
//②以下两个方法定义了两个Bean,以提供了Bean的实例化逻辑
@Bean
public UserDao userDao(){
return new UserDao();
}
@Bean
public LogDao logDao(){
return new LogDao();
}
//③定义了logonService的Bean
@Bean
public LogonService logonService(){
LogonService logonService = new LogonService();
//④将②和③处定义的Bean注入到LogonService Bean中
logonService.setLogDao(logDao());
logonService.setUserDao(userDao());
return logonService;
}
}
参考:
https://www.cnblogs.com/wuchanming/p/5426746.html
本文内容总结:1.基于xml文件定义:,2.通过@Component@Configuration注解来定义,
原文链接:https://www.cnblogs.com/peterleee/p/11003813.html
以上是 spring中定义一个Bean以及生成一个Bean实例,具体 的全部内容, 来源链接: utcz.com/z/362350.html