Spring学习整理1

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的注解

  1. @Component
  2. @Repository
  3. @Controller
  4. @Service
  5. @Configuration
  6. @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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值