1.带XML配置文件的spring注解开发
- XML配置约束
<?xml version="1.0" encoding="UTF-8"?> <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 http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:component-scan base-package="这里填写spring需要扫描的包"></context:component-scan>/> </beans>
- 注解
⑴<!--用于创建对象的-->
@component
作用: 用于将该类对象存入spring容器中
属性: value: 用于设置bean的id, 默认为该类名, 并且值为类名的首字母小写的值
@Contorller 与 @component 作用相同, 约定用在表现层
@Service 与 @component 作用相同, 约定用在业务层
@Repository 与 @component 作用相同, 约定用在持久层
⑵<!--用于注入数据的-->
@Autowired
作用: 只要spring ioc容器中有唯一的一个Bean对象类型和要注入的变量类型匹配, 就可以注入成功
出现位置: 可以是变量, 也可以是方法上.
注: Autowired 在查找时, 查找容器中的类型
如图所示:
当存在多个匹配时, Autowired会先用数据类型进行匹配, 找到多个匹配结果时, 使用变量名再次进行匹配
@Qualifier
作用: 在按照类中注入的基础之上再按照名称注入. 它可以给方法参数注入时单独使用, 在给类成员注入时不可以单独使用(需要 与Autowired配合)
属性: value: 指定注入bean的id
如:
UserDaoImp.java
UserDaoImp2.java@Repository("userDao") public class UserDaoImp implements UserDao { @Autowired private QueryRunner queryRunner; public List<User> findAll() throws SQLException { System.out.println("这是UserDaoImp"); return null; } }
UserServiceImp.java@Repository("userDao2") public class UserDaoImp2 implements UserDao { public List<User> findAll() throws SQLException { System.out.println("这是UserDaoImp2"); return null; } }
@Service("userService") public class UserServiceImp implements UserService { @Autowired @Qualifier(value = "userDao2") private UserDao userDao; public List<User> findAll() throws SQLException { return userDao.findAll(); } }
结果:
-
@Resource
作用: 直接按照bean的id注入
属性: name , 指定bean的id -
如:
@Service("userService") public class UserServiceImp implements UserService { @Resource(name="userDao2") private UserDao userDao; public List<User> findAll() throws SQLException { return userDao.findAll(); } }
结果:
以上三种注解并不能给基本类和String类型注入, 集合类型只能通过XML配置
@Value
作用: 注入基本类型和String类型
属性: value, 用于指定数据的值
支持SpEL写法 : ${表达式} -
⑶ 用于改变作用范围的注解
@Scope
作用: 用于指定bean的作用范围
属性: value : 指定范围的值
常用值: singleton 单例 //默认方式
prototype 多例
⑷与生命周期有关:
@PreDestory
作用: 用于指定销毁方法
@PostConstruct
作用: 用于指定初始化方法
2.去掉Spring的Xml配置的注解开发
1.使用@Configuration创建新类
2.使用@ComponentScan指定需要扫描的包
3.使用@Bean将当前方法的返回值放入spring的ioc容器
代码如下:
@Configuration
@ComponentScan(value = "com.chensy")
//此句等同于: <context:component-scan base-package="com.chensy"></context:componentscan>
public class SpringConfiguration
{
@Bean
public QueryRunner createQueryRunner(DataSource dataSource){
return new QueryRunner(dataSource);
}
@Bean
public DataSource createDataSource(){
try {
ComboPooledDataSource cpds = new ComboPooledDataSource();
cpds.setUser("root");
cpds.setJdbcUrl("jdbc:mysql://localhost:3306/mybatisdemoserverTimezone=UTC");
cpds.setDriverClass("com.mysql.cj.jdbc.Driver");
cpds.setPassword("goodsang123");
return cpds;
}catch (Exception e)
{
throw new RuntimeException("c3p0连接池初始化失败!");
}
}
}
测试方法:
@Test
public void testFindAll() throws SQLException {
//1.获取容器
ApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfiguration.class);
//2.得到业务层对象
UserService as = ac.getBean("userService", UserService.class);
//3.执行方法
List<User> userList = as.findAll();
for (User user : userList) {
System.out.println(user);
}
}