如何做一个企业的网站,网游推广,外贸商城 网站建设,长春网站推广方式以及Spring中为什么会出现IOC容器#xff1f;Autowired和Resource注解#xff1f;
IOC容器发展史
没有IOC容器之前 首先说一下在Spring之前#xff0c;我们的程序里面是没有IOC容器的#xff0c;这个时候我们如果想要得到一个事先已经定义的对象该怎么得到呢#xff1f;…以及Spring中为什么会出现IOC容器Autowired和Resource注解
IOC容器发展史
没有IOC容器之前 首先说一下在Spring之前我们的程序里面是没有IOC容器的这个时候我们如果想要得到一个事先已经定义的对象该怎么得到呢比如我们在想要得到一个事先定义的Person对象。
首先我们需要先在person.xml文件里面提前配置生成我们的Person对象如下
bean idperson classcom.example.Personproperty namename valueJohn/property nameage value25/
/bean然后在程序代码里面需要用到Person对象的时候我们需要从xml文件里面取出来需要写一段繁琐的代码如下图
public class Main {public static void main(String[] args) {ApplicationContext context new ClassPathXmlApplicationContext(person.xml);Person person (Person) context.getBean(person);System.out.println(Name: person.getName());System.out.println(Age: person.getAge());}
}这样当我们获取一个已经提前生成的对象的时候可以发现代码非常的多非常冗余。
有IOC容器之后 当有了IOC容器之后我们就把类似于person.xml的xml文件取消了配置文件底层还是有的但是我们程序员不用写xml配置文件了我们只需要写一个注解就可以了Spring底层会帮助我们把带有注解的类转换成对应的xml配置文件或者配置文件里面的一部分的。
如果你想要把Person对象之前提前定义好那么不直接给Person对象加上一个Component注解就可以了然后Person对象就可以自动的加入到对应的person.xml文件了。在Spring中内部是一个IOC容器你可以理解成加了Component注解的对象都被自动的加入到了IOC容器里面了。
如果你想要从IOC容器里面取出已经定义好的Person对象也不用像之前那样了需要写好多的代码现在你只需要写一个Autowire注解或者Resource注解就可以了。可以直接加在某个类的Person对象属性的上头。
发现没有有了IOC容器之后可以极大的简化我们的程序代码。能我们的程序代码变得更简单易读了。
把不同的类注入到IOC容器中使用的注解不同
Component注解 如果你的类只是一个简单的类没有任何逻辑比如说Person类那么我们把这个类注入到IOC容器使用的注解是Component注解。
Controller注解 如果你的类是Controller控制器需要定义前端的访问接口的那么我们给这个类使用Controller把其注入到IOC容器中。
Service注解 如果你的类是业务类如果你想要把这个类注入到IOC容器中需要用到Service注解。
Repository注解 如果你的类是与数据库交互的类那么需要使用Repository注解。
同时把一个类中的多个属性类加入到IOC容器中该怎样操作
上面我们使用ComponentControllerServiceRepository这些注解的时候都是把一个对象类加入到IOC容器里面那假如我现在想要同时把多个类加入到IOC容器里面该怎么办
可以使用Configuration和Bean的组合代码如下
Configuration
public class AppConfig {Beanpublic ClassA classA() {return new ClassA();}Beanpublic ClassB classB() {return new ClassB();}Beanpublic ClassC classC() {return new ClassC();}
}AppConfig配置类里面的多个类ClassAClassBClassC都会被加入到IOC容器里面对应到xml文件的id名字就是方法的名字class对象类型就是return的返回类型property就是对象里面的各个属性。
不过不要忘记我们的配置类一定要被Spring扫描一下这样才能够加入到IOC容器里面扫描的注解是ComponentScan参数加上配置类所在的包的路径即可。但是有时候我们可以给主启动类省略ComponentScan这个注解为什么呢因为程序默认就会扫描主启动类所在的包下面的所有类然后把对应的类注入到IOC容器中。如下图 因为主类OrderMain80在springcloud包下面因此这个包下面的所有的类都会被自动扫描。但Myrule包下面的类不能被自动扫描。
Autowired和Resource注解的区别
class MyTest {Autowiredprivate Person person;
}Aturowired是通过类型注入它会把IOC容器里面类型是Person的对象注入到MyTest的person属性中。但是有个问题就是如果IOC容器里面只有一个Person对象的类型那么我们直接可以把IOC容器里面的这个对象注入给MyTest的person属性不会有任何问题。但是如果IOC容器里面有多个Person对象的类型呢这个时候我们注入那个Person对象给MyTest的person属性呢答案是不知道因此现在仅仅通过Autowired注解肯定不行了我们需要加上个Qualifier(“person”)注解这样可以通过IOC容器里面的对象的名字进行注入其实底层就是通过person.xml文件的id为person的bean来找到一个唯一相关的对象进行注入的。
Resource是通过bean的id名字进行注入的Resource就相当于是Autowired和Qualifier的组合但是又不完全是为什么呢
Resource注解要求IOC容器中必须有相关对象否则会出异常。如果IOC容器中这个类型的对象只有一个那么Resource注解是按照类型注入但是如果IOC容器中这个类型的对象有多个那么Resource注解是按照名称注入而Autowired注解可以允许IOC容器里面没有相关的对象默认Autowired注解的required属性的值为true就是必须需要对象如果IOC容器没有相关对象会报错但是当我们把这个属性值设置为false的时候既便IOC容器中没有相关对象也不会报错了此时会返回一个null值。