用户自定义类型注入:
注解注入:
User类:
package com.baizhiedu.bean;
import org.springframework.stereotype.Component;
import java.io.Serializable;
//注解
@Component("u") //添加u默认值就不是user了
public class User implements Serializable {
private Integer id;
private String name;
private String password;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
UserDAO
package com.baizhiedu.injection;
public interface UserDAO {
public void save();
}
UserDAOImpl:
package com.baizhiedu.injection;
import org.springframework.stereotype.Repository;
@Repository //@Component的衍生注解 @Repository 适用于专门的dao注解产生的对象
public class UserDAOImpl implements UserDAO {
@Override
public void save() {
System.out.println("UserDAOImpl.save");
}
}
UserService
package com.baizhiedu.injection;
public interface UserService {
public void register();
}
UserServiceImpl:
package com.baizhiedu.injection;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service //@Component的衍生注解 @Service注解产生Service对象
public class UserServiceImpl implements UserService {
private UserDAO userDAO;
public UserDAO getUserDAO() {
return userDAO;
}
@Autowired //注入UserDAO 运用@Autowired注解
public void setUserDAO(UserDAO userDAO) {
this.userDAO = userDAO;
}
@Override
public void register() {
userDAO.save();
}
}
package com.baizhiedu.injection;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.annotation.Resources;
@Service //@Component的衍生注解 @Service注解产生Service对象
public class UserServiceImpl implements UserService {
//@Autowired//这个注解也可以放到成员变量之上,基于反射进行注入
@Resource(name="userDAOImpl")//JavaEE引入的注解,name属性的id值必须和UserDAOImpl的id
private UserDAO userDAO;
public UserDAO getUserDAO() {
return userDAO;
}
//@Autowired //注入UserDAO 运用@Autowired注解 注入对象的类型必须时目标成员类型相同或者使其子类(实现类)
//@Qualifier("userDAOImpl")//配合@Autowired,基于名字进行注入
public void setUserDAO(UserDAO userDAO) {
System.out.println("UserServiceImpl.setUserDAO");//验证spring有没有调用set方法为成员变量赋值
this.userDAO = userDAO;
}
@Override
public void register() {
userDAO.save();
}
}
Account:
package com.baizhiedu.lazy;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;
@Component
@Lazy //延迟在工厂创建的时候对Account对象的创建
public class Account {
public Account() {
System.out.println("Account.Account");
}
}
Product:
package com.baizhiedu.life;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
@Component
public class Product {
@PostConstruct //注解表明初始化方法
public void myInit(){
System.out.println("Product.myInit");
}
@PreDestroy //注解 表明销毁方法
public void myDestory(){
System.out.println("Product.myDestory");
}
}
Customer:
package com.baizhiedu.scope;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
@Component//注解创建对象
@Scope("singleton")//控制对象创建爱你次数 singleton只会创建一次 prototype会创建多次
public class Customer {
}
applicationContext.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:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
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/aop https://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!--
id:名字唯一
class属性:类的全限定名
通过写bean标签告诉工厂生产的对象
-->
<!-- 让spring框架在设置的包及其子包中扫描对应的注解,使其生效-->
<context:component-scan base-package="com.baizhiedu"/>
<!-- 通过配置文件可以覆注解的内容-->
<bean id="u" class="com.baizhiedu.bean.User">
<property name="id" value="10"/>
</bean>
</beans>
TestAnnotation:
package com.baizhiedu;
import com.baizhiedu.bean.User;
import com.baizhiedu.injection.UserService;
import com.baizhiedu.lazy.Account;
import com.baizhiedu.scope.Customer;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestAnnotation {
/*
用于测试:@Component注解
*/
@Test
public void test1(){
ApplicationContext ctx=new ClassPathXmlApplicationContext("/applicationContext.xml");//获得工厂
//User user=(User) ctx.getBean("user");//加入注解之后,通过id的默认值User的首字母小写,确认id:user 当User类中的注解@Component("u") 这里通过id:u创建User对象
User user=(User) ctx.getBean("u");
System.out.println("user"+user);
System.out.println("user id="+user.getId());
}
/*
用于测试@Scope注解 控制对象创建次数
*/
@Test
public void test2(){
ApplicationContext ctx=new ClassPathXmlApplicationContext("/applicationContext.xml");//获得工厂
Customer customer1 = (Customer)ctx.getBean("customer");
Customer customer2 = (Customer)ctx.getBean("customer");
System.out.println(customer1);
System.out.println(customer2);
}
/*
用于测试Lazy注解
*/
@Test
public void test3(){
ApplicationContext ctx=new ClassPathXmlApplicationContext("/applicationContext.xml");//获得工厂的时候,创建单实例对象
//如果想要延迟对象在工厂创建的时候创建,可以用到Lazy注解,延迟创建,在下面获取它的时候才会创建
Account account =(Account) ctx.getBean("account");//
}
/*
测试:声明周期相关注解
*/
@Test
public void test4(){
ClassPathXmlApplicationContext ctx=new ClassPathXmlApplicationContext("/applicationContext.xml");
ctx.close();//工厂关闭
}
/*
测试:@Autowrited注解 注入 和基于名字进行注入,JavaEE注入测试
*/
@Test
public void test5(){
ApplicationContext ctx=new ClassPathXmlApplicationContext("/applicationContext.xml");
UserService userServiceImpl=(UserService)ctx.getBean("userServiceImpl");
userServiceImpl.register();
}
}
Test1:
Test2:
Test3
Test4
Test5