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

回到顶部