You should annotate the costructor of your PersonService with @Autowired.
@Service
class PersonService {
@Autowired
public PersonService(Person person) {
this.person = person; //the object the service can work with
}
}
Then you must provide a Person bean somewhere.
But I guess the Person is an instance that is loaded from a database.
Since a PersonService is a singleton it makes no sense to bind it to one Person instance.
In this case you have to create a new PersonService instance for every Person object that you retrieve from the db.
If you want to do this then it also means that the PersonService is created by your code. Thus out of the spring containers control and therefore spring can not autowire it automatically.
Nevertheless you can use the AutowireCapableBeanFactory to autowire beans that have been instantiated outside the container. But this is a one way. These beans will not be available to those defined in the container.
AutowireCapableBeanFactory acbf = ...;
acbf.autowireBean(someInstance);
When I work with hibernate I usually use a PostLoadListener to autowire domain objects.
But there is also another approach using aspectj and load-wime weaving. Take a look at the spring documentation 8.4.1
If you need to advise objects not managed by the Spring container (such as domain objects typically), then you will need to use AspectJ. You will also need to use AspectJ if you wish to advise join points other than simple method executions (for example, field get or set join points, and so on).