spring默认单例支持循环依赖
spring中bean的初始化过程:
class—>推断构造方法—>实例化—>对象—>属性填充(见下)—>init(见下)—>AOP(见下)—>代理对象—>bean
init:
- afterPropertiesSet
代码:
@Component
public class User1Service implements InitializingBean {
//空的类
private User1 defaultUser;
@Override
public void afterPropertiesSet() throws Exception {
//从mysql中查出默认值,并赋值
defaultUser = new User1();
}
}
- @PostConstruct
代码:
@PostConstruct
public void a(){
}
AOP:
代码:
@Component
@Aspect
public class NotVeryUsefulAspect {
@Pointcut("execution(* com.my.service.IndexService.*(..))")
public void anyPublicMethod(){
}
@Before("anyPublicMethod()")
public void before(){
System.out.println("-------------aop before-----------");
}
}
使切面生效:
@ComponentScan("com.my")
//使切面生效注解
@EnableAspectJAutoProxy
public class AppConfig {}
问题1:若一个类中有一个无参的构造方法,一个有参的构造方法,那么spring会执行哪一个?
答:执行无参的构造方法
问题2:若一个类中有一个无参的构造方法,一个有参的构造方法,如何让spring去执行有参的构造方法?
答:在有参的构造方法上加注解@Autowired
问题3:若一个类中有两个有参的构造方法,没有无参的构造方法,那spring会执行哪个?
答:会报错,spring会尝试去找无参的构造方法,找不到,则报错无默认构造方法
问题4:spring获取bean的方式?
答:先bytype,后byname,spring中可以有不同名,但是同type的bean,
如orderService1–>OrderService,orderService2–>OrderService。这两个是不同的bean。如果先byname,再bytype,那么如下代码:
@Bean
public UserService orderService1(){
return new UserService();
}
填充属性流程:
查找依赖注入的Bean的步骤
注解:
- @Bean(autowireCandidate = false),autowireCandidate意思为自动注入的候选者,默认为true,为false即当前Bean不会参与到自动注入中
-
指定beanName为aa,两个注解名称一样,则返回B类中的OrderServiceA类中 @Qualifier("aa") private OrderService orderService; B类中 @Bean @Qualifier("aa") public OrderService orderService1(){ return new OrderService(); }
- @Primary 主bean,直接返回当前bean
- @Priority(1) 作用于类上,优先级