Spring能产生Bean的注解
什么是Bean
- In Spring, the objects that form the backbone of your application and that are managed by the Spring IoC container are called beans. A bean is an object that is instantiated, assembled, and otherwise managed by a Spring IoC container.
- 在 Spring 中,构成应用程序主干并由Spring IOC容器管理的对象称为bean。bean是一个由Spring IOC容器实例化、组装和管理的对象。
Spring启动过程中会自动扫描注解,当遇到能产生Bean的注解,会将注解的类自动实例化(自动扫描及实例化只进行一次)之后这个类的实例放到IOC容器中,当须要使用时(自动装配)会从容器中调用这个实例。
手动装配
创建应用对象之间的协作关系叫做装配,也就是说当一个类A的属性中声明了另一个类的B的对象,A实例化时,需要A的属性B进行实例化,这就是装配。
手动装配可以通过配置文件中的完成
<bean name="c" class="com.how2java.pojo.Category">
<property name="name" value="category 1" />
</bean>
<bean name="p" class="com.how2java.pojo.Product">
<property name="name" value="product1" />
<property name="category" ref="c" />
</bean>
完成了向p中手动注入c
自动装配
目前主要有三种自动装配方式
- byName-根据属性名称自动装配。如果一个bean的名称和其他bean属性的名称是一样的,将会自动装配它。
- byType-按数据类型自动装配。如果一个bean的数据类型是用其它bean属性的数据类型,兼容并自动装配它.
- construct-在构造函数参数的byType方式
byName
<bean id="userServiceImpl"
class="cn.com.bochy.service.impl.UserServiceImpl"
autowire="byName">
</bean>
<bean id="userDao"
class="cn.com.bochy.dao.impl.UserDaoImpl">
</bean>
byName就是通过Bean的id或者name,代码autowire="byName"意思是通过id="userDao"来查找Bean中的userDao对象
byType
byType就是按Bean的Class的类型.
若autowire="byType"意思是通过 class="cn.com.bochy.dao.impl.UserDaoImpl"来查找UserDaoImpl下所有的对象。
@Autowired
@Autowired注释可以对类的成员变量,方法和构造函数进行修饰,让Spring完成bean自动装配的工作,其默认的方式室byType。
注意事项:
在使用@Autowired时,首先在容器中查询对应类型的bean
- 如果查询结果刚好为一个,就将该bean装配给@Autowired指定的数据
- 如果查询的结果不止一个,那么@Autowired会根据名称来查找。
- 如果查询的结果为空,那么会抛出异常。解决方法时,使用required=false
https://www.cnblogs.com/fnlingnzb-learner/p/9723834.html
能产生Bean的注解
- @Component
- @Repository
- @Controller
- @Service
- @Configuration
- @Bean
@Component
@Component是一个元注解,意思是可以注解其他类注解,如@Controller @Service @Repository @Aspect。官方解释是:带此类注解的类为组件,当使用基于注解大配置和类路径扫描的时候,这些类就会被实例化。
eg:
(1).不指定bean的名称,默认为类名首字母小写university。
@Component
public class University{
to do something;
}
获取bean方式:
ApplicationContext ctx = new ClassPatheXmlapplicationContext("./config/applicationContext.xml");
University ust = (University) ctx.getBean("university");
(2).指定bean的名称
@Component(university01)
public class University{
to do something;
}
获取bean的方式:
ApplicationContext ctx = new ClassPatheXmlapplicationContext("./config/applicationContext.xml");
University ust = (University) ctx.getBean("university01");
@Repository
@Repository用于将数据访问层(DAO层)的类标示为Spring bean,该注解的作用不仅只是将类识别为bean,同时它还将所标注点类中跑出的数据访问异常封装为Spring点数据访问异常类型。
Spring本身提供一个丰富且与具体访问数据技术无关点数据访问异常结构,用于封装不同点持久层框架抛出的异常,使得异常独立与底层框架。
@Controller
- @Controller用于将控制层中的类标示为Spring bean,分发处理器会扫描使用该注解的类的方法,并检测该方法是否使用了@RequestMapping注解;
- @Controller只是定义了一个控制器类,而使用@RequestMapping注解的方法才是处理请求的处理器。
@Service
@Service用于将业务层中的类标识为Spring bean。
@Configuration
用于将配置类标识为Spring bean
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {
String value() default "";
}
可以看到其本质还是@Component,但是与@Component还是存在区别:
@Configuration中所有带有@Bean注解的方法都会被动态代理,因此调用该方法返回的都是同一个实例,而@Component中则会获取一个全新的对象实例。
@Bean
其中前五种只能对类使用,而@Bean注解可对方法注解,并且@Bean注解需要在上述五个注解的类中才能生效。
那么为什么要存在@Bean这种对方法的注解来产生Bean,作为一名调包侠,我发现事情并不简单。那是因为以上5种注解只能局限于自己所写的类,而@Bean注解就能从Jar包中的class中产生bean,如下:
@Configuration
public class MyClass {
// class1和class2就是jar包里写好的
@Bean
public Class1 getClass1() {
return new Class1();
}
@Bean
public Class2 getClass1() {
return new Class2();
}
.....
}
参考https://blog.csdn.net/sinat_27741463/article/details/82983682