Spring的配置(使用注解)
一、基础知识
spring的配置
1.spring2.5前==xml
2.spring2.5后==xml+annotation
3.spring3.0后==annotation+JavaConfig配置
spring2.5后=xml+annotation
注解:
1.注入类
替换:<bean id="" class=""></bean>
位置:类
语法:
@Component
eg:Class User{}
<bean id="user" class="com.apesource.包.User"></bean>
||等价于||
@Component
Class User{}
语法:@Component(value="注入容器中的id,如果省略id为类名且首字母小写,value属性名称可以省略")
注意:配合下面标签使用
含义:扫描所有被@Component注解所修饰的类,注入容器
<context:component-scan base-package=""></context:component-scan
@Repository=====>注入数据访问层
@Service========>注入业务层
@Controller=====>注入控制层
以上三个注解与@Component功能语法一
2.注入数据
@Value
含义:注入基本数据
语法:@Value("数据内容")
@Value("${动态获取}")
注意:配合下面标签使用
<context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder
@Autowired
语法:@Autowired(required = "true-默认、false、是否必须进行装配")
修饰:成员变量
含义:默认按照类型自动分配,如果有则直接装配,若有多个则按照名称装配
注意:
1.若容器中有一个类型可以与之匹配则装配成功,若没有一个类型可以匹配则报错
NoSuchBeanDefinitionException
2.若容器中有多个类型可以与之匹配,则自动切换为按照名称装配,若名称没有对应,则报错
NoUniqueBeanDefinitionExceptio
3.其他注解
@Primary
含义:首选项,当类型冲突的情况下,此注解修饰的类被列为首选(备胎扶正)
修饰:类
注意:不能单独使用,必须与@Component....联合使用
@Qualifier(value="名称")
含义:按照名称装配
修饰:成员变量
注意:不能单独使用,必须与@Autowired联合使用
@Resource(name="名称")
含义:按照名称装配
修饰:成员变量
注意:单独使用
@Scope
含义:配置类的作用域
修饰:类
注意:不能单独使用,必须与@Component....联合使用
@Scope("prototype")
@Scope("singleton")
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON
@PostConstruct:初始化,修饰方法
@PreDestroy:销毁,修饰方法
二、注入类
@Repository=====>注入数据访问层
@Service========>注入业务层
@Controller=====>注入控制层
1.引入依赖
<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.29</version>
</dependency>
2.创建Dao层接口
public interface IUserDao {public void save();
}
3.创建Dao层实现类
@Repository
public class UserDaoImp implements IUserDao{public void save() {System.out.println("==dao的新增==");}
}
4.创建service层接口
public interface IUserService {public void save();
}
5.创建service层实现类
@Service
public class UserServiceImp implements IUserService{public void save(){System.out.println("==业务的新增==");}
}
6.创建controller层接口
public interface IUserController {public void save();
}
7.创建controller层实现类
@Controller
public class UserControllerImp implements IUserController{public void save(){System.out.println("==控制器新增==");}
}
8.创建student实体类
@Component
//@Component(value = "stu")//起别名,下同
//@Component("stu")
public class Student {
}
9.编写spring配置文件
<!--扫描--><context:component-scan base-package="com.ape"></context:component-scan>
9.编写测试类
public class Test01
{public static void main( String[] args ) {ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");Student student=(Student)applicationContext.getBean("student");System.out.println(student);IUserController controller= (IUserController) applicationContext.getBean("userControllerImp");IUserService service=(IUserService)applicationContext.getBean("userServiceImp");IUserDao dao=(IUserDao)applicationContext.getBean("userDaoImp");controller.save();service.save();dao.save();}
}
三、注入数据
@Value
含义:注入基本数据
语法:@Value("数据内容")
@Value("${动态获取}")
注意:配合下面标签使用
<context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>
@Autowired
语法:@Autowired(required = "true-默认、false、是否必须进行装配")
修饰:成员变量
含义:默认按照类型自动分配,如果有则直接装配,若有多个则按照名称装配
1.使用@Value
1.直接注入数据内容
1.创建实体类
@Component
public class Student {@Value("中野二乃")private String name;@Value("18")private int age;@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}
}
2.测试类测试
public class Test01
{public static void main( String[] args ) {ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");Student student=(Student)applicationContext.getBean("student");System.out.println(student);}
}
2.注入动态获取数据内容
1.创建实体类
@Component
public class Student {@Value("${msg1}")private String name;@Value("${msg2}")private int age;@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}
}
2.创建db.properties属性文件
msg1=elysia
msg2=20
3.在spring配置文件中使用db.properties文件
<!--注入数据-->
<context:property-placeholder location="classpath:db.properties"></context:property-placeholder>
4.测试
public class Test01
{public static void main( String[] args ) {ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");Student student=(Student)applicationContext.getBean("student");System.out.println(student);}
}
2.使用@Autowired
默认按照类型自动分配,如果有则直接装配,若有多个则按照名称装配
1.默认按照类型自动分配
1.创建Dao层接口
public interface IUserDao {public void save();
}
2.创建Dao层实现类
@Repository
public class UserDaoImp implements IUserDao{public void save() {System.out.println("==dao的新增==");}
}
3.创建service层接口
public interface IUserService {public void save();
}
4.创建service层实现类
其中要调用dao层中定义的方法。
@Service
public class UserServiceImp implements IUserService{@AutowiredIUserDao userDao;public void save(){System.out.println("==业务的新增==");userDao.save();}
}
5.测试
public class Test01
{public static void main( String[] args ) {ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");IUserService service=(IUserService)applicationContext.getBean("userServiceImp");service.save();}
}
2.若有多个实现类则按照名称装配
1.创建第二个Dao接口实现类
@Repository
public class UserDaoImp2 implements IUserDao{public void save() {System.out.println("==dao的新增==");}
}
此时,一个接口有多个实现类,@Autowired会按照名称进行装配
2.抽象配置service层实现类
IUserDao接口定义的对象名必须与两个实现类之一的名字一致
@Service
public class UserServiceImp implements IUserService{@AutowiredIUserDao userDaoImp2;public void save(){System.out.println("==业务的新增==");userDaoImp2.save();}
}
3测试
public class Test01
{public static void main( String[] args ) {ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");IUserService service=(IUserService)applicationContext.getBean("userServiceImp");service.save();}
}
四、其他注解
@Primary
含义:首选项,当类型冲突的情况下,此注解修饰的类被列为首选(备胎扶正)
修饰:类
注意:不能单独使用,必须与@Component....联合使用
@Qualifier(value="名称")
含义:按照名称装配
修饰:成员变量
注意:不能单独使用,必须与@Autowired联合使用
@Resource(name="名称")
含义:按照名称装配
修饰:成员变量
注意:单独使用
@Scope
含义:配置类的作用域
修饰:类
注意:不能单独使用,必须与@Component....联合使用
@Scope("prototype")
@Scope("singleton")
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)
@PostConstruct:初始化,修饰方法
@PreDestroy:销毁,修饰方法
1.@Primary
1.创建Dao层接口
public interface IUserDao {public void save();
}
2.创建Dao层实现类
@Repository
@Primary //此注解修饰的类被列为首选
public class UserDaoImp implements IUserDao{public void save() {System.out.println("==dao的新增==");}
}
3.创建service层接口
public interface IUserService {public void save();
}
4.创建service层实现类
@Service
public class UserServiceImp implements IUserService{@AutowiredIUserDao dao;public void save(){System.out.println("==业务的新增==");dao.save();}
}
5.测试
public class Test01
{public static void main( String[] args ) {ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");IUserService service=(IUserService)applicationContext.getBean("userServiceImp");service.save();}
}
2.@Qualifier与@Resource
1.dao接口、service接口与dao实现类与上题一致(注释掉dao实现类中@Primary注解)
2.修改service实现类,在@Autowired后添加@Qualifier
@Service
public class UserServiceImp implements IUserService{@Autowired@Qualifier(value = "userDaoImp2")IUserDao dao;public void save(){System.out.println("==业务的新增==");dao.save();}
}
3.修改service实现类,在@Autowired后添加@Qualifier=单独添加@Resource
@Service
public class UserServiceImp implements IUserService{@Resource(name = "userDaoImp2")IUserDao dao;public void save(){System.out.println("==业务的新增==");dao.save();}
}
3.@Scope
@Scope 的含义是:配置类的作用域
@Scope("prototype"):多例作用域,每次获取bean的时候,都创建一个新的bean实例
@Scope("singleton"):单例作用域,只有一个bean实例
1.给实体类设置作用域
@Component
@Scope(value = "prototype")
public class Student {@Value("${msg1}")private String name;@Value("${msg2}")private int age;@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}
}
2.测试类测试
public class Test01
{public static void main( String[] args ) {ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");Student student=(Student)applicationContext.getBean("student");System.out.println(student);Student student1=(Student)applicationContext.getBean("student");System.out.println(student == student1);}
}
如果@Scope(value = "singleton"),输出结果为true
4.@PostConstruct与@PreDestroy
@PostConstruct:初始化,修饰方法(在操作开始前执行)
@PreDestroy:销毁,修饰方法(在销毁时执行)
1.创建实体类并定义初始化、销毁方法
@Component
public class Teacher {@PostConstructpublic void doinit(){System.out.println("Teacher doinit");}@PreDestroypublic void doDestroy(){System.out.println("Teacher doDestroy");}
}
2.测试
public class Test01
{public static void main( String[] args ) {ClassPathXmlApplicationContext applicationContext1=new ClassPathXmlApplicationContext("applicationContext.xml");applicationContext1.close();}
}