如何将一个类加入到Spring的IOC容器中呢?Spring为我们提供了5个注解:
1.@Component
2.@Controller
3.@Service
4.@Repository
5.@Configuration
其中,@Component是最基本的注解,其他的4个注解都是基于@Component.
在现在的Spring版本中,@Controller、@Service、@Repository的作用与@Component一致,以后Spring的更新可能会增强这几个注解。
@Configuration与其他几个注解不同的是它可以将多个类加入到IOC容器,而其他注解一次只能加入一个类到IOC容器中。
细节:如果一个类没有加入到IOC容器中,而另外一个类注入了这个类,在IDEA中会报错。当然,可以设置IDEA的报错级别。最好的办法是设置@Autowired(required = false),这样这个类不是必须的,服务器可以正常启动。要注意的是,如果有地方调用了这个类的方法,会引起NullPointException.
Spring中的对象实例化的时机?
我们猜测,对象的实例化时机有以下两种情况:
1.当要使用到对象的时候进行实例化。比如Controller,是在访问了url的时候,IOC容器才实例化Controller
2.当IOC容器启动的时候实例化。比如服务器启动,所有的对象都会被实例化。
通过在类的构造方法中添加输出语句,在服务器启动的时候就输出了语句,可以知道第二种情况是Spring种默认的实例化Bean的方式。
延迟加载
那有什么办法可以延迟实例化Bean吗?这时候就得请出来大哥——@Lazy
我们举个栗子。在下面的类中添加@Lazy注解:
1 |
|
在别的类中注入Diana这个类:
1 |
|
此时,Diana就可以被延迟加载了吗?
答案是否定的。在控制台的输出结果中,还是出现了Diana Start。也就是在IOC容器启动的时候,Diana就被实例化了。
咦,那是哪里出了问题呢?问题在于BannerController中注入了Diana。如果一个类想要延时加载,必须保证其他类没有使用到它。不然使用了该类的其他类也需要延时加载。说起来有点绕,意思就是说BannerController注入了Diana类,而Diana类想要延时加载,那么BannerController类也需要加上@Lazy注解进行延时加载。
加上注解后验证,Diana和BannerController都被延迟加载了。那么,它们在什么时候会被实例化呢?没错,在使用到它们的时候就会被实例化。我们在浏览器中访问BannerController对应的url,控制台输出Diana Start,它们被实例化了。推测✔
注意:除非有特别好的理由,否则不推荐使用延时加载