基于注解的IOC配置和xml的IOC配置要实现的功能都是一样的,降低程序之间的耦合,只是配置的形式不一样。
首先在bean.xml里面还是要写一部分内容
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="SpringStudy">context:component-scan>
beans>
context标签告知Spring在创建容器时要扫描的包,配置所需要的标签不是在bean的约束中,而是一个名称为context名称空间和约束中
用于创建对象的:
他们的作用和在xml配置文件里编写一个
@Component
作用:用于把当前类对象存入Spring容器中
属性:value:用于指定bean的id。但我们不写时他的默认值是当前类名(首字母小写)。
@Component
public class AccountServiceImpl implements IAccountService {
private IAccountDao accountDao = new AccountDaoImpl();
public void saveAccount(){
accountDao.saveAccount();
}
}
public class Client {
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
IAccountService as = (IAccountService)ac.getBean("accountServiceImpl");
as.saveAccount();
}
}
@Controller:一般用于表现层
@Service:一般用于业务层
@Repository:一般用于持久层
以上三个注解的作用和Component是一模一样的
他们三个是Spring框架为我们明确提供的三层使用的注解,使我们三层对象更加清晰
用于注入数据的:
他们的作用和在xml配置文件里编写一个
Autowired:
作用:按照类型注入。只要容器中有唯一的一个bean对象类型和要注入的变量类型匹配,就可以注入成功。
如果IOC容器中没有一个对象类型和我们需要注入的类型匹配,则报错。
如果IOC容器里有多个个对象的类型都满足,首先按照类型找出匹配的对象集合,然后使用变量名称作为bean的id继续查找,如果有一样的也可以注入成功,如果都不一样就报错。
出现位置:可以是成员变量上,也可以是方法上。
细节:在使用注解时,set方法就不是必须的了。
@Component
public class AccountServiceImpl implements IAccountService {
@Autowired
private IAccountDao accountDao ;
public void saveAccount(){
accountDao.saveAccount();
}
}
这个时候注入就去找Spring容器里面有没有一个类型是IAccountDao类型的对象。
@Component
public class AccountDaoImpl implements IAccountDao {
我们在AccountDaoImpl里加入了注解,这里就可以找到这个对象,然后自动注入。
Qualifier:
作用:按照类型注入的基础上再按照名称注入。它在给类成员注入时不能单独使用,在给方法参数注入时可以。
属性:value,用于指定注入bean的id
注必须与Autowired配合使用
@Autowired
@Qualifier(value = "accountDao1")
private IAccountDao accountDao ;
Resource
作用:直接按照bean的id注入,可以独立使用
属性:name,用于指定bean的id
@Resource(name = "accountDao1")
private IAccountDao accountDao ;
以上三个注解只能注入其他bean类型的数据,基本类型和String无法通过上述注解实现,另外集合类型的注解只能通过xml来实现
Value
作用:用于注入基本类型和String类型
属性:value,用于指定数据的值,它可以使用Spring中的SpEL(Spring中得el表达式)
SpEl写法:${表达式}
用于改变作用范围的:
他们的作用和在bean标签里使用scope属性是一样的
Scope:
作用:指定bean的作用范围
属性:value:(singleton,prototype)
和生命周期相关:
他们的作用和在bean里面使用init-method和destroy-method的作用是一样的
PreDestroy
作用:指定销毁的方法
PostContruct
作用:用于指定初始化方法
我们可以通过定义一个配置类,为它添加注解,使它的作用和bean.xml是一样的
1.Configuration
作用:指定当前类是一个配置类
2.ComponentScan
作用:用于通过注解指定Spring在创建容器时要扫描的包
属性:basepackage:用于指定创建容器时要扫描的包
相当于使用:
<context:component-scan base-package="SpringStudy">context:component-scan>
3.Bean
作用:把当前方法的返回值作为bean对象存入Spring容器里面
属性:name,用于指定bean的id,但不写时,默认值是当前方法的名称
<bean id="runner" class="org.apache.commons.dbutils.QueryRunner">
<constructor-arg name="ds" ref="dataSource">constructor-arg>
bean>
这个bean标签可以被替换为如下代码
@Bean(name = "runner")
public QueryRunner createQueryRunner(DataSource dataSource){
return new QueryRunner(dataSource);
}
bean前面的部分
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
在得到容器的地方做一些修改即可
原来是
ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
现在变为
ApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfiguration.class);
SpringConfiguration是我们的配置类
Import:
作用:用于导入其他配置类。把其他配置类加入主配置类里面