Spring学习总结(二)"/>
Spring学习总结(二)
Spring支持的注解
Spring 注解开启
1.使用< context:annotation-config >
<!--开启4种基本注解,需要添加context命名空间-->
<context:annotation-config/>
2.使用< context:annotation-scan >
<!--包含上述的所有注解,并扫描该包下的所有文件-->
<context:annotation-scan base-package="com.little"/>
<!--排除过滤-->
<context:component-scan base-package="com.little"><context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!--包含过滤-->
<context:component-scan base-package="com.little" use-default-filters="false"><context:include-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
</context:component-scan>
标准注解
@PostConstruct、@PreDestroy
public class Demo{@PostConstruct//在类实例化初始时调用public void init(){}@PreDestroy//在实例销毁时调用public void destroy(){}
}
作用与Bean配置中的init和destory属性相同。
@Named、@Resource、@Inject
这三个注解都属于标准注解,不是Spring特有的,但是也放到相应的功能里面再仔细记录。
依赖项检查@Required
用在属性Setter上,用以检查该属性进行依赖注入。如果没有配置则会抛出异常。
组件注解
@Named
需要额外导入,maven配置如下。它作用于属性和参数上,根据名字查找容器中对应的对象。
<dependency><groupId>javax.inject</groupId><artifactId>javax.inject</artifactId><version>1</version>
<\dependency>
@Named("user")
public class User{
}
@Component
使用在类上用于实例化Bean(以下三个注解跟此注解功能相同,但具有语义化作用)
//<bean id="userDao" class="com.littlepants.dao.impl.UserDaoImpl"></bean>
@Component("userDao")
public class UserDaoImpl implements UserDao {@Overridepublic void save() {System.out.println("save running ...");}
}
@Controller
在Web层实例化Bean
@Service
在Service层实例化Bean
//<bean id="userService" class="com.littlepants.service.impl.UserServiceImpl">
//@Component("userService")
@Service("userService")
@Repository
在Dao层实例化Bean
//<bean id="userDao" class="com.littlepants.dao.impl.UserDaoImpl"></bean>
//@Component("userDao")
@Repository("userDao")
依赖注入的注解
@Inject
可以使用在构造函数、属性、和setter方法上,需要额外引用。
public class UserService{@Injectprivate UserDao userDao;@Injectpublic UserService(UserDao userDao){this.userDao = userDao;}@Injectpublic void setUserDao(@Named("userDao") UserDao userDao){//指定名字查找this.userDao = userDao;}
}
@Autowired
在字段(属性)上用于根据类型(字段类型)依赖注入,从Spring容器中进行匹配。如果容器中有多个同类型的Bean,则会报错。属性注入有变量注入,构造器注入,set方法注入。
//变量注入
@Autowired
UserDao userDao;//构造器注入
private UserDao userDao;
@Autowired
public UserServiceImpl(UserDao userDao){this.userDao = userDao;
}//set方法注入
private UserDao userDao;
@Autowired
public void setUserDao(UserDao userDao){this.userDao = userDao;
}//一般方法注入
@Autowired
public void addUser(UserDao userDao){
}
在使用IDEA编程时,变量注入方法会被标注为不被推荐的注入方法。因为这种方式过于依赖容器,当容器没有注入这个对象时,即对象为NULL时,就会找不到此依赖。但其他两种依赖就没有这个问题,所以在使用中应该尽量避免变量注入。
@Qualifier
结合@Autowired一起使用,根据名称(id)进行依赖注入
//<bean id="userService" class="com.littlepants.service.impl.UserServiceImpl">
@Component("userService")
public class UserServiceImpl implements UserService {// <property name="userDao" ref="userDao"></property>//当包中有两个对UserDao的实现时,单单使用@Autowired会引起错误//使用@Qualifier,指定ID为userDao的实现@Qualifier("userDao")private UserDao userDao;@Autowiredpublic void setUserDao(UserDao userDao) {this.userDao = userDao;}@Overridepublic void save() {System.out.println("Service Running ...");}
}
@Resource
相当于@Autowired+@Qualifier,按照名称进行注入
//使用在属性上
@Resource(name="userDao")
private UserDao = userDao;//使用在setter方法上
private UserDao userDao;
//@Autowired
@Resource(name = "userDao")
public void setUserDao(UserDao userDao) {System.out.println("使用set方法");this.userDao = userDao;
}
@Value
注入普通(基本)属性
@Value("Hello World")
private String driver;//等价于
private String driver="Hello World";
它的使用价值在于,当你在项目中配置了JDBC属性文件时,可以直接读取JDBC文件完成初始化。
//jdbc.properties
jdbc.diver = com.mysql.cj.jdbc.Driver
<!--引入外部配置文件-->
<context:property-placeholder location="classpath:jdbc.properties"/>
@Value(${jdbc.driver})
private String driver;//driver = com.mysql.cj.jdbc.Driver
新注解
非自定义的Bean的配置,加载properties的配置,组件扫描,引入其他配置文件。
Configuration
指定当前类是Spring的配置类,当创建容器时会从该类上加载注解。
ComponentScan
用于指定Spring在初始化容器时要扫描的包,作用与xml配置文件中的< context:component-scan base-package=“com.littlepants” />一样
Bean
使用在方法上,将该方法的返回值存储到Spring容器中。
PropertySource
加载.properties文件中的配置
Import
导入其他配置类
[参考文献]陈学明.Spring+Spring MVC+MyBatis整合开发实战[M].北京:机械工业出版社,2020.
更多推荐
Spring学习总结(二)
发布评论