首先我们需要知道这个单词Component
- Component(value=“userService”)表示以名字为userService将该类加到spring容器当中
- 直接写Component则默认将该类加入spring容器中,名字是以小写字母开头的类名
- 还有另外三个@Repository、@Service、@Controller,用法一模一样,只是为了让大家更直观的知道此时是持久层、业务层还是控制层!
所以先来看看service层的实现类
package com.lp.service.impl;
import com.lp.dao.UserDao;
import com.lp.dao.impl.UserDaoImpl;
import com.lp.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.*;
/**
* Component(value="userService")如果不加值,
* 直接写Component则默认将该类加入spring容器中,
* 名字以小写字母开头的类名
*
* @Date 2020/5/26 21:21
* @Author luopeng
*/
@Service
public class UserServiceImpl implements UserService {
/* @Autowired
@Qualifier("userDaoImpl")*/
@Resource(name = "userDaoImpl")
private UserDao userDao;
public void saveUser() {
System.out.println("Annotation测试!");
userDao.saveUser();
}
}
上面的代码中你看到了@Autowired 、@Qualifier(“userDaoImpl”)和@Resource(name = “userDaoImpl”)这三个没见过的注解
首先呢@Autowired 代表的是自动注入,这时候我们如果需要把一个接口注入进来你就会用到它,它也很方便,但是,如果你需要注入的接口有着多个实现类,你就不能直接写@Autowired 了,这时候解决方案有多种:
- 可以将接口改为实现类名
- 可以将接口后的变量名改成实现类放在容器里面的名称
- 可以@Autowired配合@Qualifier(“userDaoImpl”)使用,括号里面代表的是注入的类
- 可以单独使用@Resource(name = “userDaoImpl”),括号里面代表的是注入的类
- spring基于注解是不支持注入集合类型的,只能通过xml配置注入
- 对于基本数据类型和String类型需要通过@value注解来进行注入
再看看dao层的实现类
package com.lp.dao.impl;
import com.lp.dao.UserDao;
import org.springframework.stereotype.Repository;
/**
* @Date 2020/5/26 21:20
* @Author luopeng
*/
@Repository
public class UserDaoImpl implements UserDao {
public void saveUser() {
System.out.println("保存成功!000000000000000");
}
}
package com.lp.dao.impl;
import com.lp.dao.UserDao;
import org.springframework.stereotype.Repository;
/**
* @Date 2020/5/26 21:20
* @Author luopeng
*/
@Repository
public class UserDaoImpl1 implements UserDao {
public void saveUser() {
System.out.println("保存成功!111111111111111");
}
}
我们现在只是声明要把类放在容器里面,但还没有放进去,要真正让spring找到这个类我们需要配置扫描包
<?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="com.lp"/>
</beans>
@Scope,默认单例singleton,里面也可以指明是多例的prototype
至此,配置的方式便可以运行程序了
还有两个个注解了解就行
在方法上面的注解
- @PreDestory 用于指定销毁方法
- @PostConstruct 用于指定初始化方法