新添加一个jar包
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
一、注解对象
在xml文件中 添加 <context:annotation-config />
在类中加入@Component,说明类被spring容器管理,然后添加@Autowired
该注解可以加在set方法上或者直接加载属性上,如果写在setter方法上,就会通过setter方法进行注入,如果写在变量上,就直接通过反射设置变量的值,不经过setter方法。注入时,会从spring容器中,找到一个和这个属性数据类型匹配的实例化对象注入进来,默认使用byType,根据类型匹配。
如果只能找到一个这个数据类型的对象的时候,就直接注入该对象如果找到了多个同一个类型的对象的时候,就会自动更改为byName来进行匹配,根据set方法对应的参数列表的局部变量名来匹配。
private IUserDao userDao;
@Autowired
public void setUserDao(@Qualifier("指定名字")IUserDao userDao){};
会先找符合IUserDao类型的对象有多少,一个的话就直接拿过来
多个的话,就按照setUserDao方法的参数列表的局部变量名来找
而@Qualifier 以指定名字进行匹配 ,当配置了他的时候,会强制使用byName按指定名字匹配。
@Resource默认使用byName的方式,按照名字匹配,可以写在setter方法上也可以写在变量上
先匹配set方法的名字,匹配不上再匹配方法参数列表的名字
如果还是匹配不上就会转换为byType,根据类型匹配
当然我们也可以指定名字
@Resource(name=”userDao”)
就相当于 Autowired和Qualifier 一起使用
二、注解实例化对象
在xml添加<context:component-scan base-package="com.tledu.springtest" />
base-package是最大的包路径
在需要被实例化的类加@component,默认是以类名首字母小写作为名字进行存储,可以使用@Component(“xxx”) 或者@Component(value=”xxx”)来设置名字
官方对注解进行了如下分类
三、创建spring配置类取代xml文件
先创建config包
对配置类加@Configuration,获取容器时需要使用AnnotationApplicationContext(配置类.class)。
再添加@ComponentScan("最大的包路径")用于指定 spring 在初始化容器时要扫描的包。
@Bean
作用: 该注解只能写在方法上,表明使用此方法创建一个对象,并且放入 spring 容器。
属性: name:给当前@Bean 注解方法创建的对象指定一个名称(即 bean 的 id)。
@PropertySource
用于加载.properties 文件中的配置。括号内写包名
@value在spring5版本中可以通过${}取配置文件中的值
实例化IOC容器,之后可以getbean。
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfiguration.class);
getBean方法的三种方式:
1) 根据bean元素的 id属性获得对象 需要强转类型 , bean的id写错时 会抛出 NoSuchBeanDefinitionException
User user1 = (User) context.getBean("user");
2.)根据bean元素的 class属性获得对象 要确保同一种类型的bean只能配置一个
User user2 = context.getBean(User.class);
3.)根据bean元素的 id+class属性 获得对象 要求id和类型一定要匹配正确(推荐使用)
User user3 = context.getBean("user", User.class);